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