Könnte jemand bitte den Code für die folgende Aufgabe zur Verfügung stellen: Angenommen, es gibt ein Verzeichnis mit Dateien, die alle durch ein Programm laufen müssen. Das Programm gibt die Ergebnisse in die Standardausgabe aus. Ich brauche ein Skript, das in ein Verzeichnis geht, den Befehl für jede Datei ausführt und die Ausgabe in einer großen Ausgabedatei zusammenfasst.
Zum Beispiel, um den Befehl für 1 Datei auszuführen:
$ cmd [option] [filename] > results.out
Der folgende Bash-Code übergibt $file an den Befehl, wobei $file für jede Datei in /dir steht
for file in /dir/*
do
cmd [option] "$file" >> results.out
done
Beispiel
el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Wie wäre es damit:
find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out
-maxdepth 1
verhindert, dass find rekursiv in
Unterverzeichnisse. (Wenn Sie wollen, dass solche verschachtelten Verzeichnisse verarbeitet werden, können Sie dies weglassen.)-type -f
legt fest, dass nur einfache Dateien verarbeitet werden.-exec cmd {}
weist das Programm an, cmd
mit der angegebenen Option
für jede gefundene Datei auszuführen, wobei der Dateiname durch {}
ersetzt wird\;
bezeichnet das Ende des Befehls.cmd
-Ausführungen nach
results.out
Wenn Sie jedoch Wert auf die Reihenfolge legen, in der die Dateien verarbeitet werden, sollten Sie
vielleicht besser eine Schleife schreiben. Ich denke, find
verarbeitet die Dateien
Dateien in Inode-Reihenfolge ab (obwohl ich damit falsch liegen könnte), was vielleicht nicht das ist
was Sie wollen.
Basierend auf @Jim Lewis's Ansatz:
Hier ist eine schnelle Lösung, die find
verwendet und auch Dateien nach ihrem Änderungsdatum sortiert:
$ find directory/ -maxdepth 1 -type f -print0 | \
xargs -r0 stat -c "%y %n" | \
sort | cut -d' ' -f4- | \
xargs -d "\n" -I{} cmd -op1 {}
Zum Sortieren siehe:
http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time