Methode 1 - Mit Kopf und Schwanz
Mit dem Befehl können Sie headdie 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 xargswie 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 xargsteilen 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, xargsder dann Ihr Programm ausführen würde:
$ xargs -n 40 <<<$files | xargs ...
Wenn der Inhalt der xargsDateiliste ü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}"