Як я можу використовувати "{}" для переадресації результату команди, запущеної через опцію 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команди, і вона намагається перенаправляти stdout з цієї команди на названий файл {}.svn.

Будь-які ідеї?

Відповіді:


37

Ви можете зробити перенаправлення так:

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

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


Це недоліки і погана практика. Порівняйте цю відповідь мою . Правильний шлях , щоб передати в {}якості аргументу , shа потім (всередині sh) відносяться до нього як "$0"або "$1"чи так.
Каміль Маціоровський

5

Ні, проте ви можете написати простий скрипт bash, щоб зробити це, а потім викликати його з пошуку.
Приклад ( /tmp/dump.sh ):

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

потім:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.