Como posso usar '{}' para redirecionar a saída de um comando executado através da opção -exec do find?

26

Estou tentando automatizar um comando svnadmin dump para um script de backup e quero fazer algo assim:

find /var/svn/* \( ! -name dir -prune \) -type d -exec svnadmin dump {} > {}.svn \;

Isso parece funcionar, pois ele verifica cada repositório svn em /var/svn e executa svnadmin dump nele.

No entanto, o segundo {} no comando exec não é substituído pelo nome do diretório que está sendo processado. Basicamente resulta apenas em um único arquivo chamado {}.svn .

Eu suspeito que isso ocorra porque o shell interpreta > para finalizar o comando find e tenta redirecionar o stdout desse comando para o arquivo denominado {}.svn .

Alguma idéia?

    
por pkaeding 10.01.2011 / 21:56

2 respostas

36

Você pode fazer o redirecionamento assim:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh -c 'svnadmin dump {} > {}.svn' \;

e a substituição correta será feita.

    
por 11.01.2011 / 07:10
5

Não, no entanto, você pode escrever um script bash simples para fazer isso e chamá-lo de find.
Exemplo ( /tmp/dump.sh ):

#!/bin/sh
svn admin dump "$1" > "$1".svn

então:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
    
por 10.01.2011 / 22:17