find
ist mir immer ein Rätsel, wenn ich es verwende; ich möchte einfach alles darunter /mnt
von meiner Suche ausschließen (ich bin in Bash auf Ubuntu 20.04 auf WSL, möchte also nicht, dass im Windows-Bereich gesucht wird), aber es find
stolpert einfach in diese Verzeichnisse und ignoriert mich völlig. Ich habe die Syntax auf dieser Seite gefunden.https://stackoverflow.com/questions/4210042/wie-schließt-man-ein-Verzeichnis-im-find-command-ausund alle Varianten probiert - alle sind fehlgeschlagen.
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/*'
Wenn ich dies tue, passiert einfach etwas /mnt
und es werden Fehler ausgegeben (was wirklich frustrierend ist, da die obige Syntax klar aussieht und die Syntax der Stackoverflow-Seite korrekt zu sein scheint):
find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied
Kann mir jemand zeigen, wie ich das find
Ignorieren meiner Verzeichnisausschlussschalter verhindere?
Antwort1
Find -path
schließt keine Pfade aus, es bedeutet „keine Übereinstimmungen melden, deren Name mit diesem Pfad übereinstimmt“. Es wird trotzdem in die Verzeichnisse einsteigen und sie durchsuchen. Was Sie wollen, ist -prune
(von 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
Also du möchtest:
sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*'
Je nachdem, was Sie ausschließen möchten, ist es möglicherweise einfacher, -mount
(GNU find
) oder -xdev
(andere) zu verwenden:
Aus man find
:
-mount
Keine Verzeichnisse auf anderen Dateisystemen absteigen. Ein alternativer Name für-xdev
, aus Kompatibilitätsgründen mit einigen anderen Versionen von find.
Also:
sudo find / -mount -name 'git-credential-manager*'
Antwort2
Die Option wird nicht ignoriert. Das -path
Prädikat wird für jede einzelne gefundene Datei ausgewertet und schlägt für die Dateien in diesem Baum einfach fehl. Es hat keinen Einfluss darauf, wie find
der Verzeichnisbaum durchsucht wird, und Sie könnten etwas wie find . ! -path "./foo/*" -o -name '*.txt'
which haben, das auf alles außerhalb zutrifft foo
, aber auch auf Dateien, die *.txt
darin übereinstimmen.
DerGNU-Manpageist ziemlich klar, was hier zu tun ist, verwenden Sie -prune
stattdessen:
-path pattern
... Um einen ganzen Verzeichnisbaum zu ignorieren, verwenden Sie,-prune
anstatt jede Datei im Baum zu überprüfen. Um beispielsweise das Verzeichnissrc/emacs
und alle Dateien und Verzeichnisse darunter zu überspringen und die Namen der anderen gefundenen Dateien auszudrucken, gehen Sie folgendermaßen vor:find . -path ./src/emacs -prune -o -print