Как вы вывести имя файла в команде find при использовании -exec?

17

Я использую следующую строку, чтобы найти все подкаталоги PWD и запустить svnadmin verify в каждом каталоге (я уже знаю, что это репозитории Subversion)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Это хорошо работает, кроме того, что вывод выглядит следующим образом:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

Мне бы очень хотелось, чтобы find напечатал имя файла перед выполнением команды svnadmin verify , чтобы облегчить ведение журнала.

Я попытался выжать немного ls там, но выложил его, как мне это сделать (желательно просто)?

    
задан Arronical 22.07.2015 в 13:48
источник

6 ответов

21

просто добавьте опцию -printf перед

find -printf '%p' -exec command \;
    
ответ дан Fiximan 22.07.2015 в 13:59
источник
12

Если вы не хотите рекурсировать, нет смысла использовать find . Это гораздо проще сделать прямо в оболочке:

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */ найдет все каталоги ( */ гарантирует только каталоги и файлы не найдены); echo "$d" будет печатать имя каталога; svnadmin verify "$d" проверяет каталог.

Это можно запустить либо из командной строки, либо из сценария без изменения формата.     

ответ дан terdon 22.07.2015 в 14:14
6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Я добавил -type d , если это только каталоги.

    
ответ дан 7171u 22.07.2015 в 13:53
5

Попробуйте следующее:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Если вам просто нужны каталоги (спасибо @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
    
ответ дан Maythux 22.07.2015 в 13:59
2
  • Используйте . -maxdepth 1 вместо ./* , вам нужен только первый уровень в структуре папок.
  • Используйте -type d , вам нужны только папки
  • Используйте ! -name "." , вам не нужно .
  • Используйте -exec для запуска оболочки
  • Используйте sh -c для запуска команд внутри оболочки

Ваша команда

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

или короче

  • Используйте -prune , если файл является каталогом, не входите в него

Ваша команда

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
    
ответ дан A.B. 22.07.2015 в 14:18
0

Может быть полезно передать выход find в цикл read :

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Это позволяет вам выполнить более сложную сложную командную последовательность с именами файлов, возвращаемыми find , как в этом примере ls :

find . | while read f; do echo ${f} | figlet -k; done
    
ответ дан Ves 09.06.2017 в 16:54