Ich habe ein Skript, das für eine Datei so funktioniert.
./script 0001g.log > output
für zwei oder mehr Dateien, wie diese
./script 0001g.log 0002g.log 0003g.log > output
Das Skript nimmt aus jeder Eingabedatei eine spezielle Nummer und fügt sie in eine Ausgabedatei ein.
Meine Frage ist: Ich habe 1000 Eingabedateien. Wie kann ich eine Schleife erstellen, um mein Skript auszuführen?
Antwort1
Es stehen Ihnen einige Lösungsmöglichkeiten zur Verfügung:
Einfach
$ ./script *g.log >output
... und hoffe, dass sich das *g.log
nicht so weit ausdehnt, dass die Befehlszeile zu lang wird. Das ist nicht sehr robust.
Wenn Ihr Skript nicht von der Anzahl der ihm übergebenen Dateien abhängt, d. h. wenn an output
jede Eingabedatei einfach eine Ausgabe angehängt werden kann, dann ist dies eine weitere Lösung:
$ find ./ -type f -name "*g.log" | xargs ./script >output
Eine dritte Lösung wäre, die Schleife in das Skript selbst zu verschieben:
for f in *g.log; do
# old code using "$f" as file name
done
Da es sich um ein Skript handelt, besteht hier nicht das Problem der Befehlszeilenlängenbeschränkung.
Der Aufruf des Skripts wäre nun
$ ./script >output
Antwort2
Wenn
./script 0001g.log 0002g.log 0003g.log > output
Gl.
./script 0001g.log > output
./script 0002g.log >> output
./script 0003g.log >> output
dann können Sie Schleife verwenden oder
`seq -f '%04gg.log' 10` | script > output
Antwort3
Wenn Sie möchten, können Sie die Dateien in einem Verzeichnis ablegen
/opt/location/source
/0001g.log
/0002g.log
/0003g.log
Dann können Sie in Ihrem Bash-Skript Folgendes versuchen
#!/bin/bash
# store path to files
SOURCE="/opt/location/source/"
# loop through files
for FILE in `ls $SOURCE*g.log`; do
# do what you want to specific file
echo $FILE
done