Eine Reihe von nummerierten Dateien verschieben?

14

Ich habe 291 nummerierte Dateien (beginnend bei 001 - Titel und endend bei 291 - Titel), die in separate Verzeichnisse verschoben werden müssen. (001 bis 021 bis Ordner 1, 022 bis 053 bis Ordner 2, sie müssen nicht jedes Mal die gleiche Anzahl von Dateien enthalten).

Ich dachte, ich könnte es so machen: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Ich bin mir fast sicher, dass es einen besseren Weg gibt. Was wäre das?

EDIT: Das hätte also gut funktioniert, aber ich erinnerte mich ...

Ich bin nicht mit einem Terminal festgefahren, also habe ich einen Dateimanager zum Klicken und Ziehen verwendet. Die Frage bleibt jedoch bestehen.

rauben
quelle
1
Sie möchten 21 Unterordner in Ordner 1 und 22 Ordner in Ordner 2?
Daniel Beck
Haben Sie unix.SE überprüft? Hier gibt es einen guten Thread: unix.stackexchange.com/questions/12976/…
chrisjlee
@ DanielBeck nein, ich möchte, dass die Dateien in jeden Ordner verschoben werden. Es gibt eine unterschiedliche Anzahl von Dateien in jedem Ordner.
Rob
@ ChrisJ.Lee Das ist ziemlich ähnlich zu dem, was ich vorher gemacht habe / gemacht habe, ich mag es. Da die Dateien mit anderen Dateien in einem anderen Ordner übereinstimmen, konnte ls -l | grep ^- | wc -lich die Anzahl der Zeilen ermitteln.
Rob
1
@ Rob Richtig. Trotzdem unterschiedliche Anzahl von Dateien in jedem Verzeichnis. Dies zu automatisieren (einschließlich Regeln) ist aufwändiger als ein paar Mal selbst.
Daniel Beck

Antworten:

25

Da Sie sagten, dass es nicht immer genau 21 Dateien sind, müssen Sie die Dateien manuell verschieben. Um dies effektiv zu tun, können Sie die Klammererweiterung verwenden :

mv filename{001..21} dir1
mv filename{022..53} dir2
...
drrlvn
quelle
Das sieht so aus, als könnte es funktionieren, ich werde es ausprobieren.
Rob
1
Dies funktioniert perfekt, wenn Sie nach den Klammern einen Platzhalter einfügen. Genau das brauchte ich.
Rob
2
Wenn sich die Nummer in der Mitte des Namens befindet, können Sie schreiben file{001..21}name, Sie müssen keinen Platzhalter verwenden. Wie auch immer, ich bin froh, dass es für dich funktioniert hat.
drrlvn
1

Dadurch werden die Dateien wie beschrieben verschoben (außer dass der zweite Bereich für die zweiten 21 Dateien zwischen 022 und 042 liegt).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done
Bis auf weiteres angehalten.
quelle
Es sind nicht immer 21 Dateien, aber danke.
Rob
0

Was ich meine ist, viele Dateien zu verschieben (wie zehntausende oder eine Million), Shell wird sich über die Dateiliste zu lange beschweren, wenn Sie nur {1..20} verwenden, also

In zsh können Sie das integrierte mv laden:

setopt extended_glob zmodload

zsh / files

Danach können Sie folgende Befehle verwenden:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

oder wenn Sie einige Shell-Skripte schreiben, können Sie Folgendes tun:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

Wenn Sie zsh nicht verwenden, können Sie auf /unix/128559/solving-mv-argument-list-too-long verweisen

Arron Cao
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. Welche Antwort bezeichnen Sie als "detailliertere Antwort"?
Ramhound
Dies beantwortet die Frage nicht wirklich, da OP verschiedene Dateien in verschiedene Verzeichnisse verschieben möchte.
DavidPostill