Wie finde ich jede Datei und jedes Verzeichnis, die einem Muster entsprechen, mit Ausnahme eines Verzeichnisses mit find
?
Angenommen, ich habe die folgende Dateistruktur.
. foo-exclude-me / foo.txt foo-exclude-me-not / foo.txt Bar/ foo.txt foobar / bar.txt foofoo.txt
Wie würde ich die folgende Ausgabe erhalten mit find
:
./bar/foo.txt ./bar/foobar ./bar/foobar/foofoo.txt ./foo-exclude-me-not ./foo-exclude-me-not/foo.txt
Ich habe versucht, beide folgenden Befehle zu verwenden:
finden . -name 'foo-exclude-me' -prune -o -name 'foo *' finden . -name 'foo *' \! -path './foo-exclude-me/*'
aber beide erwidern dies:
./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt
Wie kann ich das foo-exclude-me
Verzeichnis ordnungsgemäß ausschließen ?
foo-exclude-me
anstelle von./foo-exclude-me
. Versuchen Sie auch,-print
am Ende des Befehls anzuhängen.-print
undfoo-exclude-me
anstelle von./foo-exclude-me
.Antworten:
Mit no
-print
gilt die implizite Standardaktion für jede Übereinstimmung, auch für beschnittene. Das explizite-print
gilt nur unter den angegebenen Bedingungen, die sich-name 'foo*'
nur im else-Zweig von befinden-name 'foo-exclude-me'
.Verwenden
-print
Sie im Allgemeinen eine explizite Option, wenn Sie etwas Komplexeres als eine Konjunktion von Prädikaten ausführen.Ihr zweiter Versuch mit
! -path './foo-exclude-me/*'
hat nicht funktioniert, weil er./foo-exclude-me
nicht übereinstimmt./foo-exclude-me/*
(kein Nachlauf/
). Hinzufügen! -path ./foo-exclude-me
würde funktionieren.quelle
quelle
-prune
relevant ist.-prune
ist eine derfind
-print