Menggunakan
find \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
atau
find \( -path "./tmp" -o -path "./scripts" \) -prune -false -o -name "*_peaks.bed"
atau
find \( -path "./tmp" -path "./scripts" \) ! -prune -o -name "*_peaks.bed"
Urutan itu penting. Ini mengevaluasi dari kiri ke kanan. Selalu mulai dengan pengecualian jalur.
Penjelasan
Jangan gunakan -not(atau !) untuk mengecualikan seluruh direktori. Gunakan -prune. Seperti yang dijelaskan di manual:
−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.
dan di GNU temukan manual:
-path pattern
[...]
To ignore a whole
directory tree, use -prune rather than checking
every file in the tree.
Memang, jika Anda menggunakan -not -path "./pathname", find akan mengevaluasi ekspresi untuk setiap node di bawah "./pathname".
menemukan ekspresi hanyalah evaluasi kondisi.
\( \)- Operasi grup (Anda dapat menggunakan -path "./tmp" -prune -o -path "./scripts" -prune -o, tetapi lebih bertele-tele).
-path "./script" -prune- jika -pathkembali benar dan adalah sebuah direktori, kembali benar untuk direktori tersebut dan jangan tidak turun ke dalamnya.
-path "./script" ! -prune- dievaluasi sebagai (-path "./script") AND (! -prune). Ini mengembalikan "selalu benar" dari prune menjadi selalu salah. Ini menghindari pencetakan "./script"sebagai korek api.
-path "./script" -prune -false- karena -pruneselalu mengembalikan nilai true, Anda dapat mengikutinya dengan -falsemelakukan hal yang sama dari !.
-o- ATAU operator. Jika tidak ada operator yang ditentukan di antara dua ekspresi, defaultnya adalah operator AND.
Oleh karena itu, \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -printdiperluas menjadi:
[ (-path "./tmp" OR -path "./script") AND -prune ] OR ( -name "*_peaks.bed" AND print )
Cetakan penting di sini karena tanpa itu diperluas menjadi:
{ [ (-path "./tmp" OR -path "./script" ) AND -prune ] OR (-name "*_peaks.bed" ) } AND print
-printditambahkan oleh find - itulah sebabnya sebagian besar waktu, Anda tidak perlu menambahkannya dalam ekspresi Anda. Dan karena -prunemengembalikan nilai true, itu akan mencetak "./script" dan "./tmp".
Hal ini tidak perlu dilakukan di tempat lain karena kami beralih -pruneuntuk selalu mengembalikan false.
Petunjuk: Anda dapat menggunakan find -D opt expr 2>&1 1>/dev/nulluntuk melihat bagaimana itu dioptimalkan dan diperluas,
find -D search expr 2>&1 1>/dev/nulluntuk melihat jalur mana yang diperiksa.
_peaks.bed.