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?


Odpowiedzi:


23
mv `ls | head -500` ./subfolder1/

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/

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.


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.


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/


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ż.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.