Come posso usare '{}' per reindirizzare l'output di un comando attraverso l'opzione -exec di find?


28

Sto cercando di automatizzare un svnadmin dumpcomando per uno script di backup e voglio fare qualcosa del genere:

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

Questo sembra funzionare, nel senso che guarda attraverso ogni repository svn in /var/svne funziona svnadmin dumpsu di esso.

Tuttavia, il secondo {}nel comando exec non viene sostituito con il nome della directory in elaborazione. Fondamentalmente risulta solo un singolo file chiamato {}.svn.

Sospetto che ciò sia dovuto al fatto che la shell interpreta la >fine del findcomando e tenta di reindirizzare lo stdout da quel comando al file denominato {}.svn.

Qualche idea?

Risposte:


37

Puoi eseguire il reindirizzamento in questo modo:

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

e verrà effettuata la sostituzione corretta.


Questa è una pratica imperfetta e cattiva. Confronta questa mia risposta . Il modo giusto è passare {}come argomento she poi (all'interno sh) si riferiscono ad essa come "$0"o "$1"circa.
Kamil Maciorowski,

5

No, comunque puoi scrivere un semplice script bash per farlo e chiamarlo da find.
Esempio ( /tmp/dump.sh ):

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

poi:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.