¿Cómo puedo usar '{}' para redirigir la salida de un comando ejecutado a través de la opción find -exec?

28

Estoy tratando de automatizar un svnadmin dumpcomando para un script de respaldo, y quiero hacer algo como esto:

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

Esto parece funcionar, ya que mira a través de cada repositorio svn /var/svny se ejecuta svnadmin dumpen él.

Sin embargo, el segundo {}en el comando exec no se sustituye por el nombre del directorio que se está procesando. Básicamente solo da como resultado un solo archivo llamado {}.svn.

Sospecho que esto se debe a que el intérprete interpreta >que finaliza el findcomando e intenta redirigir stdout de ese comando al archivo nombrado {}.svn.

¿Algunas ideas?

pkaeding
fuente

Respuestas:

37

Puede hacer la redirección de esta manera:

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

y se realizará la sustitución correcta.

Pausado hasta nuevo aviso.
fuente
Esto es defectuoso y una mala práctica. Compara esta respuesta mía . La forma correcta es pasar {}como un argumento a shy, a continuación (en el interior sh) se refieren a ella como "$0"o "$1"más o menos.
Kamil Maciorowski
5

No, sin embargo, puede escribir un script bash simple para hacerlo y luego llamarlo desde find.
Ejemplo ( /tmp/dump.sh ):

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

luego:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
Uno de uno
fuente