Wie führe ich alle Skripte in einem Pfad aus?

13

Angenommen, ich habe ein Skript, das einen Pfad als Parameter empfängt. Wie kann ich alle Skripte ausführen, die sich in diesem Pfad befinden?

Lautaro Alvarez
quelle

Antworten:

14

Angenommen, Sie haben den Pfad zu einem Verzeichnis angegeben, verwenden Sie run-parts. Von man run-parts:

run-parts - run scripts or programs in a directory

Zunächst müssen Sie die Ausführungsberechtigung für alle Skripte festlegen, die Sie ausführen möchten. Normalerweise run-partswerden die Verzeichnisse ignoriert und auch die Dateien, die nicht ausführbar sind, befinden sich in diesem Verzeichnis.

Obwohl Sie vor dem Ausführen prüfen sollten, welche Dateien mit der --testOption ausgeführt werden:

run-parts --test /path/to/directory

Ich sollte erwähnen, dass run-partses eine strenge Namenskonvention für die auszuführenden Skripte gibt:

If neither the --lsbsysinit option nor the --regex option is given 
then the names must consist entirely of ASCII upper- and
lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens.

Überprüfen Sie man run-parts, um weitere Informationen zu erhalten.

heemayl
quelle
Als ich ein bisschen las, fand ich Folgendes: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run für script in "$ scripts_to_run_dir" / * do if test -x "$ script"; dann "$ script" fi done Es hat bei mir funktioniert, was denkst du?
Lautaro Alvarez
@LautaroAlvarez Was Sie mit diesem Skript tun, können Sie mit einem einfachen Befehl run-parts /home/you/Dropbox/scripts_to_runerledigen. Seien Sie jedoch vorsichtig bei der Benennung.
heemayl
Laufteile ist cool. Aber es hat sich für cron.d entschieden und als cron.notice in syslog geschrieben. Aber es ist eine gute Quelle für Ideen, wie das Überspringen von Temp- und Backup-Dateien ...
mmv-ru
9

Run-Parts funktionieren, wenn Ihre Skripte die richtigen Namen haben. Wenn Sie sich nicht mit dem Umbenennen Ihrer Skripte nach run-partsdem komplexen Benennungsschema befassen möchten , können Sie etwas ganz Einfaches tun

for file in ~/target/*; do $file 2>/dev/null; done

Das wird versuchen, alle Dateien (und Verzeichnisse) auszuführen, die sich in befinden ~/target. Das 2>/dev/nullleitet Fehlermeldungen um, sodass es sich nicht beschwert, wenn es versucht, Verzeichnisse oder nicht ausführbare Dateien auszuführen.

Alternativ können Sie auch das Anspruchsvollere ausprobieren

for file in ~/target/*; do
    [ -f "$file" ] && [ -x "$file" ] && "$file"
done

Dadurch wird geprüft, ob jedes der Ergebnisse eine Datei ist ( [ -f $file ]), ausführbar ist ( [ -x $file ]) und nur, wenn beide Tests erfolgreich sind, wird versucht, die Datei auszuführen.

terdon
quelle
Dieser arbeitete für mich perfekt in einem Projekt (ein gegabelt Repo) Ich arbeite an - github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
Rob