Gemäß dieser Frage:So schließen Sie Verzeichnisse bei der Suche aus, der Befehl sollte wie folgt lauten:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
Aber wenn ich es mache
find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print
Das gibt:
find: paths must precede expression: ./.cache'
find: possible unquoted pattern after predicate -o'?
aber ich habe Zitate gemacht.
Und nach -path
der Option: Soll der Pfad absolut oder relativ sein? Ich habe das aktuelle Verzeichnis eingeschlossen ./[somefile]
, aber ist es dafür erforderlich -path
?
Antwort1
-path
Sie haben das Prädikat vor dem letzten Optionswert übersehen"./.cache"
Der mit verwendete Pfad -path
muss mit dem von verwendeten Suchpfad der obersten Ebene beginnen find
. Beispiel:
find . -path './something/here'
find /etc -path '/etc/init.d'
Sie müssen möglicherweise das Platzhalterzeichen verwenden *
, wenn Sie einen Verzeichnisnamen abgleichen möchten, ohne seine Position im Dateisystembaum anzugeben. Dieses Beispiel gleicht alle Dateien ( -type f
) irgendwo unter dem Verzeichnis abwizard
find . -path '*/wizard/* -type f -print
Antwort2
Für zukünftige Leser: die POSIX-kompatiblen Lösungen, dieDurchlaufen Sie die ausgeschlossenen Verzeichnisse nicht und schließen Sie sie überhaupt nicht in die Ausgabe einhaben die allgemeinen Formate:
Einzelausschluss
find searchpath \! \( -path searchpath/excludepath -prune \)
Mehrere Ausschlüsse
find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)
Das Verhindern dieser Durchquerung kann zu einerriesigLeistungsverbesserung, wenn diese Verzeichnisse viele Dateien enthalten. Das vollständige Weglassen ausgeschlossener Verzeichnisse aus der Ausgabe verhindert unbeabsichtigte Aktionen an ihnen.
Weitere Filter und Ausgabeparameter können gesetzt werdennachalle angezeigten, außer denen wie , -maxdepth
die immer unmittelbar nach platziert werden searchpath
. Die Argumente für -path
müssen mit der Ausgabe für dieses Verzeichnis übereinstimmen find
und Platzhalter müssen maskiert/in Anführungszeichen gesetzt werden.
Für diese Frage wäre die Lösung folgende (da dies -print
die Standardeinstellung ist):
find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)
Antwort3
Ich komme auf diese Seite, wenn ich nach Informationen suche, um den Befehl „find“ dazu zu bringen, mehrere Verzeichnisse auszuschließen. Ich finde die Antwort vonWalfdie eleganteste. Aus meinem Experiment geht eine Variante hervor, die auf demselben Konzept basiert:
find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print