So führen Sie eine Schleife aus, um viele Dateien auszuführen

So führen Sie eine Schleife aus, um viele Dateien auszuführen

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.lognicht 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 outputjede 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

verwandte Informationen