Ich möchte parallel
viele Verzeichnisse in Unterverzeichnisse aufteilen. Ich habe z. B. 1.000.000 Verzeichnisse mit Inhalt, aber das ist zu viel für ein Verzeichnis. Deshalb möchte ich 10 Verzeichnisse im Hauptverzeichnis erstellen und in jedes davon 100.000 Originalverzeichnisse verschieben.
Ich habe ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"
den Befehl bereits ausprobiert, aber er verschiebt nur ~10 000 in ein Unterverzeichnis (manchmal ~6200, manchmal ~12 500) und erstellt zu viele Unterverzeichnisse – manchmal 10-mal mehr als ich brauche. Natürlich brauche ich nicht genau 100 000 Verzeichnisse in jedem Unterverzeichnis, es können 101 000 oder 98 500 Verzeichnisse sein, es sollte eine Zahl im Bereich von 100 000 sein
Also, wie kann ich dies tun, indem ich verwende parallel
?
Antwort1
GNUparallel
Lösung:
parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *
j N
- Anzahl der Job-Slots. Führen Sie bis zuN
zwei Jobs parallel aus. In Ihrem Fall führen wir 10 Jobs aus, um alle Verzeichnisse auf die 10 neuen übergeordneten Verzeichnisse zu verteilen (zu verschieben).-n100000
- Verwenden Sie höchstens100000
Argumente (Verzeichnisnamen) pro Befehlszeile{#}
- Sequenznummer des auszuführenden Jobs. Diese Ersetzungszeichenfolge wird durch die Sequenznummer des auszuführenden Jobs ersetzt.::: arguments
- Verwendungarguments
von der Kommandozeile als Eingabequelle anstelle von stdin (Standardeingabe)
Um Verzeichnisse (Verzeichnisnamen) sortiert nach Änderungszeit zu verarbeiten, verwenden Sie die folgende Pipeline:
ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'