Posługiwać się
find \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
lub
find \( -path "./tmp" -o -path "./scripts" \) -prune -false -o -name "*_peaks.bed"
lub
find \( -path "./tmp" -path "./scripts" \) ! -prune -o -name "*_peaks.bed"
Kolejność jest ważna. Ocenia od lewej do prawej. Zawsze zaczynaj od wykluczenia ścieżki.
Wyjaśnienie
Nie używaj -not
(lub !
) do wykluczania całego katalogu. Użyj -prune
. Jak wyjaśniono w instrukcji:
−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.
oraz w podręczniku GNU znajdź:
-path pattern
[...]
To ignore a whole
directory tree, use -prune rather than checking
every file in the tree.
Rzeczywiście, jeśli użyjesz -not -path "./pathname"
, find oceni wyrażenie dla każdego węzła pod "./pathname"
.
wyrażenia find to tylko ocena warunków.
\( \)
- obsługa grup (możesz użyć -path "./tmp" -prune -o -path "./scripts" -prune -o
, ale jest bardziej rozwlekła).
-path "./script" -prune
- jeśli -path
zwraca prawdę i jest katalogiem, zwraca prawdę dla tego katalogu, a nie schodzi do niego.
-path "./script" ! -prune
- ocenia jako (-path "./script") AND (! -prune)
. Przywraca „zawsze prawdę” śliwki na zawsze fałszywą. Unika drukowania "./script"
jako dopasowania.
-path "./script" -prune -false
- ponieważ -prune
zawsze zwraca true, możesz wykonać to -false
samo, co !
.
-o
- operator OR. Jeśli żaden operator nie jest określony między dwoma wyrażeniami, domyślnie używany jest operator AND.
W związku z tym \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
jest rozszerzany do:
[ (-path "./tmp" OR -path "./script") AND -prune ] OR ( -name "*_peaks.bed" AND print )
Nadruk jest tutaj ważny, ponieważ bez niego jest rozszerzany do:
{ [ (-path "./tmp" OR -path "./script" ) AND -prune ] OR (-name "*_peaks.bed" ) } AND print
-print
jest dodawany przez find - dlatego przez większość czasu nie trzeba go dodawać w swoim wyrażeniu. I od tego czasu-prune
zwraca prawdę, wypisze "./script" i "./tmp".
W innych nie jest to konieczne, ponieważ się zmieniliśmy -prune
aby zawsze zwracać fałsz.
Wskazówka: możesz użyć, find -D opt expr 2>&1 1>/dev/null
aby zobaczyć, jak jest zoptymalizowany i rozwinięty,
find -D search expr 2>&1 1>/dev/null
aby zobaczyć, która ścieżka jest zaznaczona.
_peaks.bed
.