Jak przenieść pierwsze pliki x

21

Mam ten ogromny folder z tysiącami nieuporządkowanych plików. Czy możliwe jest przeniesienie pierwszych 5000 do podfolderu za pomocą mvpolecenia? Na razie przenoszę pliki za pomocą

 mv *some_pattern* ./subfolder1/

Na razie przesuwam obrazy dość losowo, nie jest tak naprawdę ważne, jeśli w każdym podfolderze nie ma dokładnie 5000 plików. Czy jest na to lepszy sposób?

Fabinout
źródło
Zobacz także Dystrybucja tysięcy plików w podfolderach
Stéphane Chazelas,

Odpowiedzi:

23
mv `ls | head -500` ./subfolder1/
schaiba
źródło
12
(zakładając, że żaden z nazw plików nie zawiera spacji, tabulacji, nowej linii, gwiazdki, otwartego nawiasu kwadratowego, znaków znaku zapytania lub zaczyna się od -lub .i i zakładając subfolder1, że nie pojawia się na tej liście.)
Stéphane Chazelas,
@ StéphaneChazelas, jeśli plik je zawiera, jak zmodyfikujemy polecenie?
Peiti Li,
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas
15

Z zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

Aby przenieść do 5000 zwykłych plików w kolejności, w jakiej znajdują się w katalogu.

Dla pierwszych 5000 na liście posortowanej leksykograficznie:

mv -- *(D.[1,5000]) ./subfolder1

Jeśli pojawi się błąd dotyczący listy arg za długo . Możesz użyć polecenia zshbuitin mv, wydając:

zmodload zsh/files

pierwszy.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Stéphane Chazelas
źródło
2
Fragment
kodu
co jeśli otrzymam błąd przy użyciu bash?
Brian Thomas
8

Wersja, która jest prosta i obsługuje specjalne znaki, spacje itp.

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

Aby to działało tak, jak jest, dir2musi istnieć i należy go wykonać z katalogu nadrzędnego dir1i dir2.

Spowoduje to przeniesienie 1000 plików z katalogu 1 do katalogu 2.

Luis Antolín Cano
źródło
niezłe! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ do przenoszenia 1000 największych plików w katalogu 1 (-S wyświetla plik według rozmiaru)
oneklc
1
Zauważ, że ls -Qnie produkuje danych wyjściowych zgodnych z xargsoczekiwanym formatem wejściowym. Pomaga w nazwach plików zawierających znaki spacji, ale nie w przypadku podwójnych cudzysłowów lub ukośników odwrotnych i szkodzi nazwom plików zawierającym znaki sterujące, w tym TAB.
Stéphane Chazelas
3

Może być konieczne zrobienie czegoś takiego:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

Ten skrypt działa w wersjach bash, ksh, sh i wielu wariantach UNIX.

Karlson
źródło
1
(pod warunkiem, że żaden z nazw plików nie zawiera spacji, tabulacji, nowej linii, gwiazdki, otwartego nawiasu kwadratowego, znaków znaku zapytania lub zaczyna się od - lub. i pod warunkiem destination, że nie pojawia się na tej liście.)
Stéphane Chazelas
@StephaneChazelas True. To nie jest kompletne rozwiązanie, tylko metoda radzenia sobie z problemem.
Karlson
3
  1. Przejdź do katalogu, z którego chcesz przenieść pliki
  2. uruchom poniżej polecenia

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

W findpoleceniu .(kropka) oznacza bieżący katalog

znajdzie pliki, które zaczynają się od Hello, a kończą na gz, pierwsze 5000 plików zostanie przeniesionych na ścieżkę /data01/path/

Pratik Hiremath
źródło
1

Udało mi się wykonać ruch 50 000 bez błędu mv bash

 ls | head -50000 | xargs -I{} sudo mv {} 01/

Zabawne, że był to udział samby, więc limit 50 KB wynika z tego, że GUI Eksploratora Windows nie lubi więcej niż 60 000 plików w reż.

Brian Thomas
źródło