Wie kann ich '{}' verwenden, um die Ausgabe eines Befehls umzuleiten, der über die Option -exec von find ausgeführt wird?

28

Ich versuche, einen svnadmin dumpBefehl für ein Sicherungsskript zu automatisieren , und möchte Folgendes tun:

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

Dies scheint insofern zu funktionieren, als es jedes svn-Repository durchsucht /var/svnund svnadmin dumpdarauf ausgeführt wird.

Der zweite {}im exec-Befehl wird jedoch nicht durch den Namen des verarbeiteten Verzeichnisses ersetzt. Es ergibt sich im Grunde nur eine einzelne Datei mit dem Namen {}.svn.

Ich vermute, dass dies daran liegt, dass die Shell interpretiert >, um den findBefehl zu beenden , und versucht, stdout von diesem Befehl in die genannte Datei umzuleiten {}.svn.

Irgendwelche Ideen?

pkaeding
quelle

Antworten:

37

Sie können die Umleitung folgendermaßen durchführen:

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

und die korrekte Ersetzung wird durchgeführt.

Bis auf weiteres angehalten.
quelle
Dies ist eine fehlerhafte und schlechte Praxis. Vergleiche meine Antwort . Der richtige Weg ist, {}als Argument zu übergeben shund dann (innen sh) als "$0"oder "$1"oder so darauf zu verweisen .
Kamil Maciorowski
5

Nein, Sie können jedoch ein einfaches Bash-Skript schreiben, um dies zu tun, und es dann von find aus aufrufen.
Beispiel ( /tmp/dump.sh ):

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

dann:

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