Copie um script de shell em vários diretórios de destino e execute-o

0

Eu tenho vários diretórios e subdiretórios como C201201A / RA /, C201202A / RB etc. Então eu quero copiar setphase.sh em todos os subdiretórios e também executá-lo. Eu tentei o código abaixo

#!/bin/bash
ls -d */*/ > folders.txt
no=1
while read folder
    do echo $folder
       cp setphase.sh $folder
       sh setphase.sh
       no='expr $no + 1'
done < folders.txt

onde tenho que escrever sh setphase.sh ?

    
por Preet 04.08.2016 / 22:32

2 respostas

1

Se o script realmente não precisa estar no diretório (muito poucos fazem ... e aqueles que são quase certamente mal escritos e precisam ser corrigidos), você pode usar find ' -execdir opção para apenas executar o script dentro de cada diretório. Por exemplo:

find . -mindepth 2 -maxdepth 2 -type d -execdir /path/to/setphase.sh \;

Na página do GNU find man:

-execdir command ;

-execdir command {} +

Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find.

This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files.

As with the -exec action, the + form of -execdir will build a command line to process more than one matched file, but any given invocation of command will only list files that exist in the same subdirectory.

If you use this option, you must ensure that your $PATH environment variable does not reference .; otherwise, an attacker can run any commands they like by leaving an appropriately-named file in a directory in which you will run -execdir.

The same applies to having entries in $PATH which are empty or which are not absolute directory names. If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status. If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be run at all.

The result of the action depends on whether the + or the ; variant is being used; -execdir command {} + always returns true, while -execdir command {} ; returns true only if command returns 0.

    
por 05.08.2016 / 17:04
0

Se todo o subdiretório estiver sob o diretório C2012A/ , você poderá cp do script para os subdiretórios e executá-lo posteriormente usando uma construção for como:

for d in C2012A/*/; do
    cp setphase.sh "$d"
    sh "$d"/setphase.sh
done

Assumindo que o script não depende da localização de onde está sendo executado.

Observe também que, fazendo sh setphase.sh , você está mencionando explicitamente para executar o script como um argumento para sh (pode ser dash , bash ou outro, dependendo do sistema), independentemente da shebang, que pode obter resultados indesejáveis se você usar qualquer bash-isms dentro do script.

Se os subdiretórios estiverem em diretórios diferentes:

for d in C2012A/*/ A1812A/*/ B8012B/*/; do
    cp setphase.sh "$d"
    sh "$d"/setphase.sh
done

substitua os nomes dos diretórios para atender aos seus requisitos.

    
por 04.08.2016 / 22:37