Ausschließen von Verzeichnissen bei der Suche

Ausschließen von Verzeichnissen bei der Suche

findist mir immer ein Rätsel, wenn ich es verwende; ich möchte einfach alles darunter /mntvon 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 findstolpert 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 /mntund 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 findIgnorieren meiner Verzeichnisausschlussschalter verhindere?

Antwort1

Find -pathschließ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:

-mountKeine 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 -pathPrä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 findder 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 *.txtdarin übereinstimmen.

DerGNU-Manpageist ziemlich klar, was hier zu tun ist, verwenden Sie -prunestattdessen:

-path pattern
... Um einen ganzen Verzeichnisbaum zu ignorieren, verwenden Sie, -pruneanstatt jede Datei im Baum zu überprüfen. Um beispielsweise das Verzeichnis src/emacsund 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

verwandte Informationen