Wie schließe ich Verzeichnisse bei der Suche richtig aus?

Wie schließe ich Verzeichnisse bei der Suche richtig aus?

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 -pathder Option: Soll der Pfad absolut oder relativ sein? Ich habe das aktuelle Verzeichnis eingeschlossen ./[somefile], aber ist es dafür erforderlich -path?

Antwort1

-pathSie haben das Prädikat vor dem letzten Optionswert übersehen"./.cache"

Der mit verwendete Pfad -pathmuss 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 , -maxdepthdie immer unmittelbar nach platziert werden searchpath. Die Argumente für -pathmüssen mit der Ausgabe für dieses Verzeichnis übereinstimmen findund Platzhalter müssen maskiert/in Anführungszeichen gesetzt werden.


Für diese Frage wäre die Lösung folgende (da dies -printdie 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

verwandte Informationen