Como você gera o nome do arquivo no comando find enquanto usa -exec?

20

Eu uso a seguinte linha para encontrar todos os subdiretórios do PWD e executar svnadmin verify em cada diretório (eu já sei que eles são repositórios do Subversion)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Isso funciona bem, além do fato de que a saída se parece com isso:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

Eu realmente gostaria que find imprimisse o nome do arquivo antes de executar o comando svnadmin verify , para facilitar o registro.

Eu tentei espremer um pouco de ls lá, mas coloquei nele, como devo fazer isso (de preferência, simplesmente)? ​​

    
por Arronical 22.07.2015 / 13:48

7 respostas

22

adicione simplesmente uma opção -printf antes

find -printf '%p' -exec command \;
    
por Fiximan 22.07.2015 / 13:59
12

Se você não quiser recorrer, não faz sentido usar find . É muito mais simples fazer isso diretamente no shell:

for d in */; do echo "$d"; svnadmin verify "$d"; done

O for d in */ encontrará todos os diretórios (o */ garante apenas diretórios e nenhum arquivo é encontrado); o echo "$d" imprimirá o nome do diretório; a svnadmin verify "$d" irá verificar o diretório.

Isso pode ser executado diretamente da linha de comando ou de um script sem alteração no formato.

    
por terdon 22.07.2015 / 14:14
6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Eu adicionei -type d se forem apenas diretórios.

    
por 7171u 22.07.2015 / 13:53
5

Tente isto:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Se você quiser apenas diretórios (graças à nota @kos):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
    
por Maythux 22.07.2015 / 13:59
2
  • Use . -maxdepth 1 em vez de ./* , você precisa apenas do primeiro nível na estrutura de pastas
  • Use -type d , você precisa apenas de pastas
  • Use ! -name "." , você não precisa de .
  • Use -exec para iniciar um shell
  • Use sh -c para iniciar comandos dentro do shell

Seu comando

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

ou menor

  • Use -prune se o arquivo for um diretório, não entre nele

Seu comando

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
    
por A.B. 22.07.2015 / 14:18
0

Pode ser útil canalizar a saída find para read loop:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Ele permite que você execute sequências de comando mais complexas e compostas com nomes de arquivos retornados por find , como neste exemplo extravagante ls :

find . | while read f; do echo ${f} | figlet -k; done
    
por Ves 09.06.2017 / 16:54
0

find tem sinalizadores de opção para impressão, que já foram mencionados em outras respostas. Se observarmos o problema na perspectiva de executar vários comandos para o mesmo arquivo atualmente processado, find permite usar várias instruções -exec . Isso significa que podemos optar por usar:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

Novamente, observe que essa abordagem é aplicável não apenas à impressão com echo , printf ou outros utilitários, mas também a outros comandos.

    
por Sergiy Kolodyazhnyy 28.05.2018 / 01:49