Frage

Ich teilte einen großen text-Datei in eine Anzahl von Sätzen der kleinere für performance-Tests, die ich mache.Es gibt eine Reihe von Verzeichnissen, wie diese:

/home/brianly/output-02 (contains 2 files myfile.chunk.00 and myfile.chunk.01)
/home/brianly/output-04 (contains 4 files...)
/home/brianly/output-06 (contains 6 files...)

Es ist wichtig zu beachten, dass es einen zunehmenden Anzahl von Dateien in jedem Verzeichnis.Was ich tun müssen, ist, eine ausführbare Datei auszuführen, gegen jede text-Dateien in das output-Verzeichnisse.Der Befehl sieht so etwas wie dieses gegen eine einzelne Datei:

./myexecutable -i /home/brianly/output-02/myfile.chunk.00 -o /home/brianly/output-02/myfile.chunk.00.processed

Hier der-i-parameter ist die Eingabe der Datei-und parameter-o ist der Ausgang Position.

In C# würde ich Schleife über die Verzeichnisse erhalten Sie die Liste der Dateien in jedem Ordner, dann Schleife über Sie zu laufen die befehlslinien.Wie kann ich Durchlaufen einer Verzeichnisstruktur wie dies mit bash und führen Sie den Befehl mit den korrekten Parametern ein, basierend auf dem Standort und Dateien in die Lage?

War es hilfreich?

Lösung

Für diese Art von Sache, die ich immer verwenden finden zusammen mit xargs:

$ find output-* -name "*.chunk.??" | xargs -I{} ./myexecutable -i {} -o {}.processed

Jetzt seit Ihr Skript-Prozesse, die nur eine Datei gleichzeitig mit -exec (oder -execdir) direkt mit finden, wie bereits angedeutet, ist genauso effizient, aber ich bin es gewohnt, mit xargs, wie, dass ist in der Regel viel effizienter, wenn die Fütterung einen Befehl auf vielen Argumente auf einmal.So ist es eine sehr nützliche Werkzeug zu halten in einem utility-Gürtel, so dass ich dachte, es sollte erwähnt werden.

Andere Tipps

Etwas wie:

for x in `find /home/brianonly -type f`
do
./yourexecutable -i $x -o $x.processed
done

Wie andere vorgeschlagen haben, verwenden Sie find(1):

# Find all files named 'myfile.chunk.*' but NOT named 'myfile.chunk.*.processed'
# under the directory tree rooted at base-directory, and execute a command on
# them:
find base-directory -name 'output.*' '!' -name 'output.*.processed' -exec ./myexecutable -i '{}' -o '{}'.processed ';'

Aus den Angaben, es klingt, als wäre dies eine ganz einfache übersetzung, die von Ihrem C# - Idee.

for i in /home/brianly/output-*; do
    for j in "$i/"*.[0-9][0-9]; do
        ./myexecutable -i "$j" -o "$j.processed"
    done
done

Das ist es, was die find Befehl für.

http://linux.die.net/man/1/find

Verwendung finden und exec.Haben Sie einen Blick auf folgende

http://tldp.org/LDP/abs/html/moreadv.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top