По этому вопросу:Как исключить каталоги при поиске, команда должна быть такой:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
Но если я это сделаю
find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print
Это дает:
find: paths must precede expression: ./.cache'
find: possible unquoted pattern after predicate -o'?
но я сделал цитаты.
Также, после -path
опции, путь должен быть абсолютным или относительным? Потому что я включил текущий каталог ./[somefile]
, но нужен ли он для -path
?
решение1
Вы пропустили -path
предикат перед последним значением параметра."./.cache"
Путь, используемый с -path
должен начинаться с пути поиска верхнего уровня, используемого find
. Например
find . -path './something/here'
find /etc -path '/etc/init.d'
Вам может понадобиться использовать *
подстановочный знак, если вы хотите сопоставить имя каталога без указания его положения в дереве файловой системы. Этот пример сопоставит все файлы ( -type f
) где-то в каталогеwizard
find . -path '*/wizard/* -type f -print
решение2
Для будущих читателей: решения, совместимые с POSIX,не обходить исключенные каталоги и вообще не включать их в выводимеют общие форматы:
Единичное исключение
find searchpath \! \( -path searchpath/excludepath -prune \)
Множественные исключения
find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)
Предотвращение этого обхода может привести когромныйулучшение производительности, когда эти каталоги содержат много файлов. Полное исключение исключенных каталогов из вывода предотвращает непреднамеренное выполнение операций с ними.
Могут быть размещены дополнительные фильтры и выходные параметры.послевсе показанные, за исключением тех, которые -maxdepth
всегда располагаются сразу после searchpath
. Аргументы -path
должны соответствовать тому, что find
будет выведено для этого каталога, а подстановочные знаки должны быть экранированы/заключены в кавычки.
Для этого вопроса решение будет таким (поскольку -print
является значением по умолчанию):
find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)
решение3
Я попадаю на эту страницу, когда ищу информацию, как заставить команду find исключать несколько каталогов. Я нахожу ответВальфсамый элегантный. Из моего эксперимента, вариация, основанная на той же концепции:
find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print