Как я могу использовать '{}', чтобы перенаправить вывод команды, запущенной через параметр find -exec?

28

Я пытаюсь автоматизировать svnadmin dumpкоманду для сценария резервного копирования, и я хочу сделать что-то вроде этого:

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

Кажется, это работает, так как просматривает каждый репозиторий SVN /var/svnи запускает svnadmin dumpего.

Однако вторая {}в команде exec не заменяет имя обрабатываемого каталога. В основном это просто один файл с именем {}.svn.

Я подозреваю, что это потому, что оболочка интерпретирует, >чтобы завершить findкоманду, и пытается перенаправить стандартный вывод из этой команды в файл с именем {}.svn.

Любые идеи?

pkaeding
источник

Ответы:

37

Вы можете сделать перенаправление следующим образом:

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

и правильная замена будет сделана.

Приостановлено до дальнейшего уведомления.
источник
Это ошибочная и плохая практика. Сравните этот мой ответ . Правильный путь , чтобы передать в {}качестве аргумента , shа затем (внутри sh) относятся к нему как "$0"или "$1"или так.
Камиль Мачоровский
5

Нет, однако вы можете написать простой bash-скрипт для этого и затем вызвать его из find.
Пример ( /tmp/dump.sh ):

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

тогда:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
OneOfOne
источник