Jak mogę użyć „{}”, aby przekierować dane wyjściowe polecenia uruchamianego przez opcję find -exec?

28

Próbuję zautomatyzować svnadmin dumppolecenie dla skryptu zapasowego i chcę zrobić coś takiego:

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

Wydaje się, że to działa, ponieważ przegląda każde repozytorium svn /var/svni działa svnadmin dumpna nim.

Jednak druga {}komenda exec nie zastępuje nazwy przetwarzanego katalogu. Zasadniczo wynika tylko jeden plik o nazwie {}.svn.

Podejrzewam, że dzieje się tak, ponieważ powłoka interpretuje >zakończenie findpolecenia i próbuje przekierować standardowe wyjście z tego polecenia do pliku o nazwie {}.svn.

Jakieś pomysły?

pkaeding
źródło

Odpowiedzi:

37

Możesz wykonać przekierowanie w następujący sposób:

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

i zostanie dokonane prawidłowe podstawienie.

Wstrzymano do odwołania.
źródło
Jest to wadliwa i zła praktyka. Porównaj moją odpowiedź . Właściwym sposobem jest przekazanie {}jako argumentu sh, a następnie (w środku sh) odnoszą się do niej, jak "$0"i "$1"czy tak.
Kamil Maciorowski
5

Nie, możesz jednak napisać prosty skrypt bash, aby to zrobić, a następnie wywołać go z find.
Przykład ( /tmp/dump.sh ):

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

następnie:

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