So verschieben Sie die ersten x-Dateien

21

Ich habe diesen riesigen Ordner mit Tausenden von ungeordneten Dateien. Ist es möglich, die ersten 5000 über den mvBefehl in einen Unterordner zu verschieben ? Im Moment verschiebe ich Dateien mit

 mv *some_pattern* ./subfolder1/

Momentan bewege ich Bilder ganz nach dem Zufallsprinzip. Es ist nicht wirklich wichtig, ob sich nicht genau 5000 Dateien in jedem Unterordner befinden. Gibt es einen besseren Weg, es zu tun?

Fabinout
quelle

Antworten:

23
mv `ls | head -500` ./subfolder1/
schaiba
quelle
12
(Vorausgesetzt, keiner der Dateinamen enthält Leerzeichen, Tabulatoren, Zeilenumbrüche, Sterne, offene eckige Klammern, Fragezeichen oder beginnt mit -oder .und geht davon aus subfolder1, dass er nicht in dieser Liste aufgeführt ist.)
Stéphane Chazelas
@ StéphaneChazelas Wenn die Datei diese enthält, wie ändern wir den Befehl?
Peiti Li
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas
15

Mit zsh:

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

Um bis zu 5000 normale Dateien in der Reihenfolge zu verschieben, in der sie sich im Verzeichnis befinden.

Für die ersten 5000 in der lexikografisch sortierten Liste:

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

Wenn Sie eine zu lange Fehlermeldung zu arg list erhalten . Sie können den Befehl zshbuitin verwenden, mvindem Sie Folgendes eingeben :

zmodload zsh/files

zuerst.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Stéphane Chazelas
quelle
2
Das POSIX-Snippet ist ein Juwel
iruvar
Was ist, wenn ich den Fehler mit Bash bekomme?
Brian Thomas
8

Eine einfache Version, die Sonderzeichen, Leerzeichen usw. unterstützt.

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

Damit dies funktioniert, dir2muss es existieren und Sie müssen es aus dem übergeordneten Verzeichnis von dir1und ausführen dir2.

Dadurch werden 1000 Dateien von dir1 nach dir2 verschoben.

Luis Antolín Cano
quelle
Schön! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ zum Verschieben von 1000 größten Dateien in dir1 (-S listet die Dateien nach Größe auf)
oneklc
1
Beachten Sie, dass ls -Qkeine Ausgabe erzeugt wird, die mit xargsdem erwarteten Eingabeformat von kompatibel ist . Dies ist hilfreich für Dateinamen, die Leerzeichen enthalten, nicht jedoch für doppelte Anführungszeichen oder Backslashes. Dateinamen, die Steuerzeichen, einschließlich TAB, enthalten, können ebenfalls beschädigt werden.
Stéphane Chazelas
3

Möglicherweise müssen Sie Folgendes tun:

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

Dieses Skript funktioniert in bash, ksh, sh und mehreren UNIX-Varianten.

Karlson
quelle
1
(vorausgesetzt, keiner der Dateinamen enthält Leerzeichen, Tabulatoren, Zeilenumbrüche, Sterne, offene eckige Klammern, Fragezeichen oder beginnt mit - oder - und wird destinationselbst nicht in dieser Liste
angezeigt
@StephaneChazelas True. Dies ist keine vollständige Lösung, sondern nur eine Methode zur Lösung des Problems.
Karlson
3
  1. Gehen Sie in das Verzeichnis, aus dem Sie Dateien verschieben möchten
  2. Führen Sie den folgenden Befehl aus

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

Im findBefehl .kennzeichnet (Punkt) das aktuelle Verzeichnis

Findet Dateien, die mit Hello beginnen und mit gz enden, werden die ersten 5000 Dateien in den Pfad verschoben /data01/path/

Pratik Hiremath
quelle
1

Ich konnte einen Zug von 50.000 erfolgreich ausführen, ohne dass der mv bash-Fehler wie dieser auftrat

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

Komischerweise befand sich dies auf einer Samba-Freigabe, so dass das 50-KB-Limit darauf zurückzuführen ist, dass die GUI von Windows Explorer im Allgemeinen nicht mehr als 60 KB-Dateien in einem Verzeichnis mag.

Brian Thomas
quelle