Hier sind ein paar zusätzliche Möglichkeiten, was Sie suchen mit Notizen über die Vor- und Nachteile.
Folgendes funktioniert nur mit Dateinamen, die keine Zeilenumbrüche enthalten. Es paart die Dateien im Lockstep. Es verwendet einen zusätzlichen Dateideskriptor, um von der ersten Liste zu lesen. Wenn im1_dir
mehr Dateien enthält, stoppt die Schleife, wenn im2_dir
abläuft. Wenn im2_dir
mehr Dateien enthält, ist file1
für alle unerreichten file2
leer. Natürlich, wenn sie die gleiche Anzahl von Dateien enthalten, gibt es kein Problem.
#!/bin/bash
im1_dir=(~/prev1/*.png)
im2_dir=(~/prev3/*.png)
exec 3< <(printf '%s\n' "${im1_dir[@]}")
while IFS=$'\n' read -r -u 3 file1; read -r file2
do
run_black "$file1" "$file2"
done < <(printf '%s\n' "${im1_dir[@]}")
exec 3<&-
Sie konsequent das Verhalten machen kann, so dass die Schleife, egal mit nur nicht leer abgestimmt Dateien stoppt die Liste länger ist wie so das Semikolon mit einem Doppelampersand durch Ersetzen:
while IFS=$'\n' read -r -u 3 file1 && read -r file2
Diese Version verwendet eine for
Schleife anstelle einer while
Schleife. Dieser stoppt, wenn die kürzere der beiden Listen ausgeht.
#!/bin/bash
im1_dir=(~/prev1/*.png)
im2_dir=(~/prev3/*.png)
for ((i = 0; i < ${#im1_dir[@]} && i < ${#im2_dir[@]}; i++))
do
run_black "${im1_dir[i]}" "${im2_dir[i]}"
done
Diese Version ist ähnlich dem unmittelbar über, aber wenn einer der Listen abläuft es wickelt sich um die Elemente wieder zu verwenden, bis der andere abläuft. Es ist sehr hässlich und du könntest dasselbe auf eine andere Art und Weise einfacher machen.
#!/bin/bash
im1_dir=(~/prev1/*.png)
im2_dir=(~/prev3/*.png)
for ((i = 0, j = 0,
n1 = ${#im1_dir[@]},
n2 = ${#im2_dir[@]},
s = n1 >= n2 ? n1 : n2,
is = 0, js = 0;
is < s && js < s;
i++, is = i, i %= n1,
j++, js = j, j %= n2))
do
run_black "${im1_dir[i]}" "${im2_dir[i]}"
done
Diese Version verwendet nur ein Array für die innere Schleife (zweites Verzeichnis). Es wird nur so oft ausgeführt, wie Dateien im ersten Verzeichnis vorhanden sind.
#!/bin/bash
im1_dir=~/prev1/*.png
im2_dir=(~/prev3/*.png)
for file1 in $im1_dir
do
run_black "$file1" "${im2_dir[i++]}"
done
Suchen Sie das "kartesische Produkt"? Zum Beispiel, wenn Verzeichnis 1 Dateien A B C und Verzeichnis 2 hat Dateien a b c, Sie suchen nach den 9 Ausgabedateien (Aa, Ab, Ac, Ba, Bb, Bc, Ca, Cb, Cc) richtig? – jedwards
@jedwards: Ich denke, das OP will Aa Bb Cc anstatt ein kartesisches Produkt. –
@DennisWilliamson: ich auch, aber zu viel darüber nachzudenken machte mich unsicher – jedwards