Исключение каталогов из поиска

Исключение каталогов из поиска

findвсегда для меня полная загадка, когда я его использую; я просто хочу исключить все под /mnt(я в bash на Ubuntu 20.04 на WSL, поэтому не хочу, чтобы он искал в пространстве Windows) из моего поиска, но findпросто натыкается на эти каталоги, полностью игнорируя меня. Я нашел синтаксис с этой страницы.https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-commandи перепробовал все варианты - все безуспешно.

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

Когда я это делаю, он просто ошибается /mntи выдает ошибки (что действительно раздражает, поскольку синтаксис выше выглядит понятным, а синтаксис страницы stackoverflow кажется правильным):

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

Может ли кто-нибудь показать мне, как перестать findигнорировать мои переключатели исключения каталогов?

решение1

Find -pathне исключает пути, это означает "не сообщать о совпадениях, имя которых совпадает с этим путем". Он все равно спустится в каталоги и будет искать их. То, что вам нужно -prune(из man find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

Итак, вы хотите:

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

Хотя, исходя из того, что вы пытаетесь исключить, может быть проще использовать -mount(GNU find) или -xdev(другие):

От man find:

-mountНе спускаться в каталоги других файловых систем. Альтернативное имя для -xdev, для совместимости с некоторыми другими версиями find.

Так:

sudo find / -mount -name 'git-credential-manager*' 

решение2

Он не игнорирует опцию. -pathПредикат оценивается для каждого файла, который встречается, и для файлов в этом дереве он просто терпит неудачу. Он не влияет на то, как findпроходит дерево каталогов, и вы могли бы иметь что-то вроде find . ! -path "./foo/*" -o -name '*.txt'which, которое соответствовало бы всему снаружи foo, но также и файлам, соответствующим *.txtвнутри него.

TheСтраница руководства GNUдостаточно ясно, что здесь делать, -pruneвместо этого используйте:

-path pattern
... Чтобы проигнорировать все дерево каталогов, используйте -pruneвместо проверки каждого файла в дереве. Например, чтобы пропустить каталог src/emacsи все файлы и каталоги в нем, а также вывести имена других найденных файлов, сделайте что-то вроде этого:

find . -path ./src/emacs -prune -o -print

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