Как правильно исключить каталоги при поиске?

Как правильно исключить каталоги при поиске?

По этому вопросу:Как исключить каталоги при поиске, команда должна быть такой:

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

Связанный контент