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 -pathzwraca 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ż -prunezawsze zwraca true, możesz wykonać to -falsesamo, 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" -printjest 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
-printjest 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/nullaby zobaczyć, jak jest zoptymalizowany i rozwinięty,
find -D search expr 2>&1 1>/dev/nullaby zobaczyć, która ścieżka jest zaznaczona.
_peaks.bed.