Qual comando unix eu seria capaz de escrever um script Bash Shell que criaria arquivos em uma série de diretórios?

3

Eu preciso escrever em um shell script que pega uma lista de diretórios do arquivo (os diretórios estariam em linhas diferentes) e então para cada um desses caminhos ele criaria um arquivo falso oculto ( .hiddenfile por exemplo) em cada um desses diretórios.

Veja, o problema que estou tentando resolver é comprometer diretórios vazios no controle de origem e estamos usando o Git, que ignora arquivos vazios. No entanto, eu gostaria de saber reutilizar esta solução (ou seja, a parte em que um script recebe uma lista de diretórios e cria ou edita arquivos em cada um desses diretórios) para outros problemas potencialmente.

A lista de diretórios seria absoluta assim: directories.txt :

/Users/johnnydoe/dir1/
/Users/johnnydoe/dir2/subdir2_1/
/Users/johnnydoe/dir3/subdir3_1/subdir3_2/
/Users/johnnydoe/dir4/
...

O conteúdo do .hiddenfile seria realmente arbitrário. Só precisa de algo para que o git confirme os arquivos da seguinte forma:

# don't leave me out of source control

Não tenho certeza de qual comando do Unix usar ou para facilitar isso.

Estou usando a versão do Unix para Mac OS X, se isso for importante.

Qualquer sugestão seria muito apreciada com antecedência.

    
por racl101 04.03.2013 / 19:24

3 respostas

3

Supondo que seus nomes de diretório sejam mais ou menos sadios (os espaços são bons), isso deve funcionar:

while read -r n; do \
   echo "# don't leave me out of source control" > "$n"/.hiddenfile; \
done < dirlist.txt

Este scriptlet iterará pela lista de diretórios em dirlist.txt , salvando cada linha como $n . Em seguida, ele usa echo para imprimir o texto desejado no arquivo .hiddenfile em cada diretório.

    
por 04.03.2013 / 19:36
0

xargs funciona muito bem para executar um comando para cada argumento em uma lista.

por exemplo, (cygwin, o OS X tem xargs também):

$ find ~/tmp/ -type d | xargs.exe -Iz  echo echo $RANDOM \> "z/.hidden"   |sh
$ find ~/tmp -type f -name \.hidden |head -n4
/home/jaroslav/tmp/.hidden
/home/jaroslav/tmp/Data/.hidden
/home/jaroslav/tmp/Data/Meshes/.hidden
/home/jaroslav/tmp/Data/Meshes/actors/.hidden

find ~/tmp -type d pode ser substituído por cat /path/dirlist.txt

A primeira parte do pipe gera uma lista de diretórios. A segunda parte cria um comando que faria eco de um número aleatório (bash) e o gravaria em um arquivo no diretório encontrado. A última parte do pipe executa esses comandos.

    
por 05.03.2013 / 06:17
0

Uma linha "um" usando tee :

echo "# don't leave me out of source control" |
 tee $( while read -r; do echo "$REPLY/.hiddenfile"; done < directories.txt) \
 > /dev/null
    
por 05.03.2013 / 15:54