Methode 1 - Mit Kopf und Schwanz
Mit dem Befehl können Sie head
die ersten 40 Dateien aus einer Dateiliste wie folgt herausziehen:
$ head -40 input_files | xargs ...
Um die nächsten 40 zu bekommen:
$ tail -n +41 input_file | head -40 | xargs ...
...
$ tail -n +161 input_file | head -40 | xargs ...
Mit derselben Technik können Sie die Liste 40 Mal gleichzeitig durchgehen.
Methode 2 - Verwenden von xargs
Wenn Sie zufällig alle Ihre Dateinamen in einer Variablen haben, können Sie xargs
wie folgt die Liste in Blöcke mit einer X-Anzahl von Elementen aufteilen.
Beispiel
Stellen Sie sich vor, meine Dateien heißen 1-200. Also lade ich sie in eine Variable wie folgt:
$ files=$(seq 200)
Sie können die ersten Elemente in dieser Variablen sehen:
$ echo $files | head -c 20
1 2 3 4 5 6 7 8 9 10
Jetzt xargs
teilen wir es auf:
$ xargs -n 40 <<<$files
1 2 3 4 5 6 7 8 9 10 ...
41 42 43 44 45 46 47 ...
81 82 83 84 85 86 87 ...
121 122 123 124 125 ...
141 142 143 144 145 ...
161 162 163 164 165 ...
181 182 183 184 185 ...
Sie könnten dann den obigen Befehl an einen anderen übergeben, xargs
der dann Ihr Programm ausführen würde:
$ xargs -n 40 <<<$files | xargs ...
Wenn der Inhalt der xargs
Dateiliste über eine Variable nicht leicht zugänglich ist, können Sie stattdessen eine Liste über eine Datei erstellen:
$ xargs -n 40 <input_file
1 2 3 4 5 6 7 8 9 10 ...
41 42 43 44 45 46 47 ...
81 82 83 84 85 86 87 ...
121 122 123 124 125 ...
141 142 143 144 145 ...
161 162 163 164 165 ...
181 182 183 184 185 ...
Methode 3 - Bash-Arrays
Angenommen, Sie hatten Ihre Dateinamen in einem Bash-Array. Wieder verwende ich eine Sequenz mit der Nummer 1-200, um meine Dateinamen darzustellen.
$ foo=( $(seq 200) )
Sie können den Inhalt des Arrays folgendermaßen sehen:
$ echo ${foo[@]}
1 2 3 4 5 ....
Nun zum 1. 40:
$ echo "${foo[@]:0:40}"
Die 2. 40 usw.:
$ echo "${foo[@]:40:40}"
...
$ echo "${foo[@]:160:40}"