
Angenommen, ich habe zwei Dateisätze foo_A_uid.bar
und foo_B_uid.bar
. Jeder Satz enthält (eine bekannte) Anzahl von Dateien. Nun möchte ich die entsprechenden Paare mit einem Tool verarbeiten ( ImageMagick
in meinem Fall), d. h. ich möchte ausführen some_command foo_A_i.bar foo_B_i.bar out_i.bar
, wobei out_i.bar
das Ergebnis/die Ausgabe beim Ausführen des Tools für das Paar foo_A_i.bar
und foo_B_i.bar
für einige feste Werte ist i
.
Meine Frage ist, wie ich diesen Vorgang stapelweise durchführen kann. Irgendein python
Skript bash
?
Klärung:Mit Dateisatz meine ich eine Liste von Dateien, die alle mit dem gleichen Anfangsbuchstaben beginnen, dann eine UID haben und die gleiche Erweiterung haben. Dies gilt sowohl für Eingabesätze als auch für die Ausgabe.
Antwort1
Hier ist eine mögliche Lösung, die funktioniert, obwohl ich nicht weiß, ob sie gut ist.
#!/bin/bash
EXPECTED_ARGS=3
E_BADARGS=65
if [ $# -ne $EXPECTED_ARGS ]
then
echo Not the right number of arguments
exit $E_BADARGS
fi
for i in $( ls $1* ); do
TMP=$(echo $2$(echo $i | cut -d'_' -f2))
TMP2=$(echo $3$(echo $i | cut -d'_' -f2))
convert $i $TMP +append $TMP2
done
Die Ausführung sollte etwa so aussehen:
script foo_A_ foo_B_ out_
Antwort2
#!/bin/bash
count=$(wc -l foo_A_uid.bar)
for line in $(seq 1 ${count/ */})
do
aline=$(sed -n $line"p" foo_A_uid.bar)
bline=$(sed -n $line"p" foo_A_uid.bar)
yourcommand "$aline" "$bline"
done
Vorausgesetzt, beide Dateien sind sortiert, liefert die count-Zeile die Anzahl der Zeilen in Datei a. Dann läuft eine Schleife über alle Werte von 1..count. Die count-Variable enthält den Namen der Datei, der mit abgeschnitten wird ${count/ */}
. Mit sed erhält man aus beiden Dateien die gleiche Zeile. -n bedeutet 'standardmäßig kein Drucken', $line"p" druckt dann einfach die Zeile $line.