Ich muss ein Skript schreiben, das einige ausführbare Dateien in einem Verzeichnis entsprechend dem letzten Änderungsdatum ausführt. Die älteste sollte zuerst ausgeführt werden. Wie mache ich das?
Das habe ich bisher getan
for f in ./jobqueue/*; #accessing the queue
do
chmod +x * # giving executable permission for the files
$f # running the executables
done
Antwort1
Shell-Globbings werden standardmäßig in lexikalischer Reihenfolge erweitert. Wenn Sie eine andere Sortierreihenfolge benötigen, brauchen Sie eine Shell, die die Angabe der Reihenfolge unterstützt, zsh
was wahrscheinlich eine gute Sache ist, da Sie dort bereits Syntax verwenden zsh
(indem Sie keine Anführungszeichen setzen $f
).
for f in ./jobqueue/*(.NOm); do
chmod +x $f
$f
done
Der (.NOm)
Teil besteht zsh
aus Globbing-Qualifizierern. .
Nur für normale Dateien, N
um bei fehlender passender Datei auf nichts zu erweitern, anstatt einen Fehler zu melden (als ob die nullglob
Option aktiviert wäre), Om
um beim Ändern order (Großbuchstaben für umgekehrte Reihenfolge) zu verwenden .m
Mit der GNU-Shell ( bash
) und mit GNU ls
wäre das Äquivalent:
eval "files=($(ls -drt --quoting-style=shell ./jobqueue/* 2> /dev/null))"
for f in "${files[@]}"
[ -f "$f" ] && [ ! -L "$f" ] || continue
chmod +x -- "$f"
"$f"
done
Antwort2
Vorausgesetzt, dass Ihre Dateinamen keine Leerzeichen, Tabulatoren, Zeilenumbrüche oder ?
oder *
oder enthalten [
und dass das Verzeichnis keine Unterverzeichnisse enthält, können Sie etwas wie
for f in $(ls -tr ./jobqueue/) ; do
chmod +x ./jobqueue/$f
./jobqueue/$f
done