Como executar todos os scripts em um caminho?

13

Suponha que eu tenha um script que receba um caminho como parâmetro. Como eu poderia executar todos os scripts localizados nesse caminho?

Lautaro Alvarez
fonte

Respostas:

14

Supondo que por caminho você quis dizer caminho para um diretório, use run-parts. De man run-parts:

run-parts - run scripts or programs in a directory

No início, você precisa definir a permissão de execução em todos os scripts que deseja executar. Normalmente run-partsignorará os diretórios e também os arquivos que não são executáveis ​​residem nesse diretório.

Embora antes de executar, você deve verificar quais arquivos serão executados pela --testopção:

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

Devo mencionar que run-partspossui uma convenção de nomenclatura estrita para que os scripts sejam executados:

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.

Marque man run-partspara ter mais ideia.

heemail
fonte
Lendo um pouco, achei o seguinte: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run para o script em "$ scripts_to_run_dir" / * faça se testar -x "$ script"; então "$ script" fi done Funcionou para mim, o que você acha?
Lautaro Alvarez
@LautaroAlvarez O que você está fazendo com esse script, poderia ser feito facilmente com um simples comando run-parts /home/you/Dropbox/scripts_to_run.BE cuidado com a nomeação embora ..
heemayl
peças de corrida é legal. Mas ele criou o cron.d e gravou no syslog como cron.notice. Mas boa fonte de idéias, como temperatura salto e arquivos de backup ...
MMV-ru
9

As peças executadas funcionarão se seus scripts tiverem os nomes corretos. Se você não deseja renomear seus scripts para se adequar ao run-partsesquema de nomeação complexo, faça algo tão simples quanto

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

Isso tentará executar todos os arquivos (e diretórios) encontrados no ~/target. O 2>/dev/nullredireciona as mensagens de erro para não reclamar ao tentar executar diretórios ou arquivos não executáveis.

Como alternativa, você pode tentar o mais sofisticado

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

Isso verificará se cada um dos resultados é um arquivo ( [ -f $file ]), é executável ( [ -x $file ]) e somente se os dois testes forem bem-sucedidos, ele tentará executar o arquivo.

Terdon
fonte
Este funcionou perfeitamente para mim em um projeto (um repositório bifurcado) no qual estou trabalhando - github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
22417 Rob