Jak wykonać wszystkie skrypty na ścieżce?

13

Załóżmy, że mam skrypt, który otrzymuje ścieżkę jako parametr. Jak mogę wykonać wszystkie skrypty znajdujące się na tej ścieżce?

Lautaro Alvarez
źródło

Odpowiedzi:

14

Zakładając, że przez ścieżkę rozumiesz ścieżkę do katalogu, użyj run-parts. Od man run-parts:

run-parts - run scripts or programs in a directory

Najpierw musisz ustawić uprawnienia do wykonywania wszystkich skryptów, które chcesz uruchomić. Zwykle run-partszignoruje katalogi, a także pliki, które nie są wykonywalne, znajdują się w tym katalogu.

Chociaż przed uruchomieniem powinieneś sprawdzić, które pliki będą uruchamiane przez --testopcję:

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

Powinienem wspomnieć, że run-partsma ścisłą konwencję nazewnictwa dla skryptów do wykonania:

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.

Sprawdź, man run-partsaby uzyskać więcej pomysłów.

heemayl
źródło
Czytając trochę, znalazłem to: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run dla skryptu w „$ scripts_to_run_dir” / * zrób jeśli test -x „$ script”; potem „$ script” fi zrobione Działa dla mnie, co myślisz?
Lautaro Alvarez
@LautaroAlvarez To, co robisz z tym skryptem, można łatwo zrobić za pomocą prostego polecenia .. run-parts /home/you/Dropbox/scripts_to_runzachowaj ostrożność przy nazywaniu ...
heemayl
części biegowe są fajne. Ale zrobił to dla cron.d i napisał do syslog jako cron.notice. Ale to dobre źródło pomysłów, takich jak pomijanie temp i tworzenie kopii zapasowych plików ...
mmv-ru
9

Części wykonawcze będą działać, jeśli skrypty mają poprawne nazwy. Jeśli nie chcesz zajmować się zmianą nazwy skryptu w celu dopasowania do run-partszłożonego schematu nazewnictwa, możesz zrobić coś tak prostego jak

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

Spowoduje to próbę wykonania wszystkich plików (i katalogów) znalezionych w ~/target. Te 2>/dev/nullkomunikaty o błędach przekierowania, więc nie będzie narzekać, gdy próbuje uruchomić katalogi lub niewystąpienia jednego lub pliki wykonywalne.

Alternatywnie możesz wypróbować bardziej wyrafinowane

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

Spowoduje to sprawdzenie, czy każdy z wyników jest plikiem ( [ -f $file ]), jest wykonywalny ( [ -x $file ]) i tylko wtedy, gdy oba testy zakończą się powodzeniem, spróbuje wykonać plik.

terdon
źródło
Ten działał dla mnie idealnie w projekcie (rozwidlone repo), nad którym pracuję - github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
Rob