¿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?

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.


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 '{}' \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.