Я использую следующую строку, чтобы найти все подкаталоги 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
туда, но затолкал, как мне это сделать (желательно просто)?
command-line
bash
scripts
find
Arronical
источник
источник
'%p'
на'%p\n'
так, чтобы имя предшествовало выводу проверки в его собственной строке.-printf '%p\n'
на более простой-print
find -name <a_name> -print -exec command {} \;
Если вы не хотите рекурсии, нет никакого смысла в использовании
find
. Гораздо проще сделать это непосредственно в оболочке:for d in */
Найти все каталоги (то*/
гарантирует , что только каталоги и файлы найдены);echo "$d"
будет печатать имя каталога файлов;svnadmin verify "$d"
проверит каталог.Это можно запустить либо напрямую из командной строки, либо из скрипта без изменения формата.
источник
find
так много. Спасибо за улучшение моих знаний, хотя!dotglob
иglobstar
в bash, что создает более длинный и более сложный скрипт. Я склонен экономить глобусы для больших сложных задач, в то время какfind
синтаксис проще собрать на лету, просто собрав несколько фильтров и команд в одну строку.find
более простым. Я всегда предпочитаю globs,find
так как я не только нахожу их намного проще, но и безопаснее, когда имеешь дело с произвольными именами файлов, которые передаются другим программамЯ добавил,
-type d
если это только каталоги.источник
{}
, по крайней мере, вsvnadmin verify {}
-exec
порождает дочернюю оболочку, в которой выполняются две команды, используя в;
качестве конца строки?Попробуй это:
Если вам нужны каталоги (спасибо заметке @kos):
источник
for f in */
будут обрабатываться только каталоги. -maxdepth 1
вместо./*
, вам нужен только первый уровень в структуре папок-type d
, вам нужны только папки! -name "."
, вам не нужно.
-exec
для запуска оболочкиsh -c
для запуска команд внутри оболочкиВаша команда
или короче
-prune
если файл является каталогом, не спускайтесь в негоВаша команда
источник
-prune
выглядит интересно. Раньше я./* -maxdepth 0
не возвращался.
из команды поиска. Это не вызывает никаких критических ошибок, но я предпочитаю, чтобы их не было.find
имеет флажки для печати, которые уже упоминались в других ответах. Если мы посмотрим на проблему с точки зрения выполнения нескольких команд для одного и того же обрабатываемого файла, то можноfind
использовать несколько-exec
операторов. Это означает, что мы можем использовать:Опять же , обратите внимание , что этот подход применим не только печать с
echo
,printf
или другими утилитами, но и другие команды.источник
Может быть полезно передать
find
вывод вread
цикл:Это позволяет вам выполнять более сложную, сложную последовательность команд с именами файлов, возвращаемыми
find
, как в этом необычномls
примере:источник
Это напечатает имя и содержимое файлов только рекурсивно.
источник