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

28

Estou tentando automatizar um svnadmin dumpcomando 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 olha através de cada repositório svn /var/svne roda svnadmin dumpnele.

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

Eu suspeito que isso ocorre porque o shell interpreta >para finalizar o findcomando e tenta redirecionar o stdout desse comando para o arquivo nomeado {}.svn.

Alguma ideia?

pkaeding
fonte

Respostas:

37

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.

Pausado até novo aviso.
fonte
Essa é uma prática imperfeita. Compare esta minha resposta . O caminho certo é passar {}como um argumento para she depois (dentro sh) referem a ele como "$0"ou "$1"mais ou menos.
Kamil Maciorowski
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 '{}' \;
OneOfOne
fonte