subdiretório de lista com alguma conversão de nomenclatura

2

Eu quero escrever um script que execute alguns comandos em meus subdiretórios com nomes contendo ou, em vez disso, finalize com algumas cadeias, por exemplo, *-nom1 , *-nom2 , *-nom3 . ou seja,

for dir in $(subs)
do
   // do something in this dir
done

minha pergunta é, essa seria a maneira de listar meus subdiretórios, senão qual é a melhor maneira de fazer isso:

subs = find -maxdepth 2 -type d -name '*-nom1'
&& find -maxdepth 2 -type d -name '*-nom2' 
&& find -maxdepth 2 -type d -name '*-nom3'

Eu posso testá-lo no meu terminal Ubuntu e parece funcionar.

meu script será executado em Debian se isso ajudar.

    
por r m 25.11.2016 / 21:39

2 respostas

1

Duas coisas em que consigo pensar

  1. Combine três invocações de find em uma

    find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
    
  2. Use a capacidade de find de executar comandos para evitar o loop externo for

    find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \) \
    -exec sh -c 'for d; do cd "$d"; cmd1; cmd2; cmd3; ...; done' sh {} + 
    
por 25.11.2016 / 22:00
1

Você pode combinar testes em find com -o em pé de "ou"; o operador implícito entre os testes é "e". Por exemplo:

subs="$(find -maxdepth 2 -type d \( \
  -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) )"
for d in $subs ; do
  ... do something with "$d" ...
done

Os parantheses em torno de '-name' -nom1 "-o -name" -nom2 "-o" * -nom3 "precisam ser citados porque são palavras reservadas para o shell.

Agora, como observa don_crissti em um comentário, a recomendação geral é evitar a captura da saída de find , por dois motivos; primeiro, porque os nomes dos arquivos podem conter espaços e novas linhas, além de caracteres especiais e filho; e segundo, porque find , por sua própria natureza, faz um loop sobre os resultados. O melhor idioma é usar o loop implícito em find ; consulte Por que o loop é sobre a prática ruim de saída em> e a discussão associada:

find -maxdepth 2 -type d \( \
  -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) -exec \
  ... do something with '{}' ...
\;
    
por 25.11.2016 / 21:58