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 -path
kembali 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 -prune
selalu mengembalikan nilai true, Anda dapat mengikutinya dengan -false
melakukan 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" -print
diperluas 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
-print
ditambahkan oleh find - itulah sebabnya sebagian besar waktu, Anda tidak perlu menambahkannya dalam ekspresi Anda. Dan karena -prune
mengembalikan nilai true, itu akan mencetak "./script" dan "./tmp".
Hal ini tidak perlu dilakukan di tempat lain karena kami beralih -prune
untuk selalu mengembalikan false.
Petunjuk: Anda dapat menggunakan find -D opt expr 2>&1 1>/dev/null
untuk melihat bagaimana itu dioptimalkan dan diperluas,
find -D search expr 2>&1 1>/dev/null
untuk melihat jalur mana yang diperiksa.
_peaks.bed
.