Verwenden
find \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
oder
find \( -path "./tmp" -o -path "./scripts" \) -prune -false -o -name "*_peaks.bed"
oder
find \( -path "./tmp" -path "./scripts" \) ! -prune -o -name "*_peaks.bed"
Die Reihenfolge ist wichtig. Es wird von links nach rechts ausgewertet. Beginnen Sie immer mit dem Pfadausschluss.
Erläuterung
Verwenden Sie -not
(oder !
) nicht, um das gesamte Verzeichnis auszuschließen. Verwenden Sie -prune
. Wie im Handbuch erklärt:
−prune The primary shall always evaluate as true; it
shall cause find not to descend the current
pathname if it is a directory. If the −depth
primary is specified, the −prune primary shall
have no effect.
und im GNU Handbuch finden:
-path pattern
[...]
To ignore a whole
directory tree, use -prune rather than checking
every file in the tree.
Wenn Sie verwenden -not -path "./pathname"
, wertet find den Ausdruck für jeden Knoten unter aus "./pathname"
.
Suchausdrücke sind nur eine Zustandsbewertung.
\( \)
- Gruppenoperation (Sie können verwenden -path "./tmp" -prune -o -path "./scripts" -prune -o
, aber es ist ausführlicher).
-path "./script" -prune
- Wenn -path
true zurückgegeben wird und ein Verzeichnis ist, geben Sie true für dieses Verzeichnis zurück und steigen Sie nicht in dieses Verzeichnis ab.
-path "./script" ! -prune
- es bewertet als (-path "./script") AND (! -prune)
. Es setzt das "immer wahr" der Pflaume auf immer falsch zurück. Das Drucken "./script"
als Match wird vermieden .
-path "./script" -prune -false
- Da -prune
immer true zurückgegeben wird, können Sie dem folgen -false
, um dasselbe zu tun wie !
.
-o
- ODER-Operator. Wenn zwischen zwei Ausdrücken kein Operator angegeben ist, wird standardmäßig der Operator AND verwendet.
Daher \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
wird erweitert auf:
[ (-path "./tmp" OR -path "./script") AND -prune ] OR ( -name "*_peaks.bed" AND print )
Der Druck ist hier wichtig, weil er ohne erweitert wird auf:
{ [ (-path "./tmp" OR -path "./script" ) AND -prune ] OR (-name "*_peaks.bed" ) } AND print
-print
wird durch find hinzugefügt - deshalb müssen Sie es die meiste Zeit nicht in Ihren Ausdruck einfügen. Und da -prune
true zurückgegeben wird, werden "./script" und "./tmp" ausgegeben.
Bei den anderen ist dies nicht erforderlich, da wir -prune
auf immer false zurückgegeben haben.
Hinweis: Sie können verwenden, um find -D opt expr 2>&1 1>/dev/null
zu sehen, wie es optimiert und erweitert wird, um
find -D search expr 2>&1 1>/dev/null
zu sehen, welcher Pfad überprüft wird.
_peaks.bed
.