Comment puis-je utiliser '{}' pour rediriger la sortie d'une commande exécutée via l'option -exec de find?

28

J'essaie d'automatiser une svnadmin dumpcommande pour un script de sauvegarde, et je veux faire quelque chose comme ceci:

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

Cela semble fonctionner, en ce sens qu'il parcourt chaque référentiel svn /var/svnet s'exécute svnadmin dumpdessus.

Cependant, le second {}de la commande exec n'est pas remplacé par le nom du répertoire en cours de traitement. Il en résulte simplement un seul fichier nommé {}.svn.

Je soupçonne que cela est dû au fait que le shell interprète la >fin de la findcommande et essaie de rediriger stdout de cette commande vers le fichier nommé {}.svn.

Des idées?

pkaeding
la source

Réponses:

37

Vous pouvez faire la redirection comme ceci:

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

et la substitution correcte sera effectuée.

En pause jusqu'à nouvel ordre.
la source
C'est une pratique défectueuse et mauvaise. Comparez ma réponse . La bonne façon est de passer {}comme un argument shpuis ( à l' intérieur sh) s'y référer comme "$0"ou environ "$1".
Kamil Maciorowski
5

Non, mais vous pouvez écrire un script bash simple pour le faire, puis l'appeler depuis find.
Exemple ( /tmp/dump.sh ):

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

puis:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
OneOfOne
la source