Как выполнить все сценарии в пути?

13

Предположим, у меня есть скрипт, который получает путь в качестве параметра. Как я могу выполнить все сценарии, расположенные по этому пути?

Лаутаро Альварес
источник

Ответы:

14

Предполагая, что под путем вы подразумевали путь к каталогу, используйте run-parts. От man run-parts:

run-parts - run scripts or programs in a directory

Сначала вам нужно установить разрешение на выполнение всех скриптов, которые вы хотите запустить. Обычно run-partsигнорирует каталоги, а также файлы, которые не являются исполняемыми, находятся в этом каталоге.

Хотя перед запуском вы должны проверить, какие файлы будут запускаться с помощью --testопции:

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

Я должен упомянуть, что run-partsесть строгое соглашение об именах для скриптов, которые будут выполнены:

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.

Проверьте, man run-partsчтобы получить больше идей.

heemayl
источник
Прочитав немного, я нашел это: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run для скрипта в "$ scripts_to_run_dir" / * do if test -x "$ script"; тогда "$ script" fi done Это работает для меня, что вы думаете?
Лаутаро Альварес
@LautaroAlvarez То, что вы делаете с этим сценарием, может быть легко сделано с помощью простой команды ... run-parts /home/you/Dropbox/scripts_to_runхотя будьте осторожны с именами ..
heemayl
обкатка это круто. Но это сделано для cron.d и записи в системный журнал как cron.notice. Но это хороший источник идей, таких как пропуск временных файлов и файлов резервных копий ...
mmv-ru
9

Запущенные части будут работать, если ваши скрипты имеют правильные имена. Если вы не хотите иметь дело с переименованием ваших скриптов в соответствии run-partsсо сложной схемой именования, вы можете сделать что-то простое, например:

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

Это попытается выполнить все файлы (и каталоги), найденные в ~/target. Эти 2>/dev/nullсообщения об ошибках переадресовывает , поэтому он не будет жаловаться при попытке запуска каталогов или не являющихся исполняемые файлы.

Кроме того, вы можете попробовать более сложные

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

Это проверит, является ли каждый из результатов file ( [ -f $file ]), выполнимым ( [ -x $file ]) и только если оба эти теста пройдут успешно, он попытается выполнить файл.

terdon
источник
Этот проект отлично работал для меня в проекте (разветвленное репо), над которым я работаю - github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
Роб