Jika -prune
tidak bekerja untuk Anda, ini akan:
find -name "*.js" -not -path "./directory/*"
Peringatan: membutuhkan melintasi semua direktori yang tidak diinginkan.
Gunakan -prune
utama. Misalnya, jika Anda ingin mengecualikan ./misc
:
find . -path ./misc -prune -o -name '*.txt' -print
Untuk mengecualikan beberapa direktori, ATAU di antara tanda kurung.
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
Dan, untuk mengecualikan direktori dengan nama tertentu di tingkat mana pun, gunakan -name
primer bukan -path
.
find . -type d -name node_modules -prune -o -name '*.json' -print
Saya menemukan yang berikut ini lebih mudah untuk dipikirkan daripada solusi lain yang diusulkan:
find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
Catatan Penting: jalur yang Anda ketikkan setelah -path
harus sama persis dengan apa find
akan mencetak tanpa pengecualian. Jika kalimat ini membingungkan Anda, pastikan untuk menggunakan jalur lengkap di seluruh keseluruhan perintah seperti ini:find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
. Lihat catatan [1] jika Anda menginginkan pemahaman yang lebih baik.
Di dalam \(
dan \)
adalah ekspresi yang akan cocok persis build/external
(lihat catatan penting di atas), dan jika berhasil, hindari melintasi apa pun di bawah . Ini kemudian dikelompokkan sebagai ekspresi tunggal dengan tanda kurung yang lolos, dan diawali dengan -not
yang akan membuat find
lewati apa pun yang cocok dengan ekspresi itu.
Orang mungkin bertanya apakah menambahkan -not
tidak akan membuat semua file lain disembunyikan oleh -prune
muncul kembali, dan jawabannya adalah tidak. Caranya -prune
berfungsi adalah apa pun yang, setelah tercapai, file di bawah direktori itu akan diabaikan secara permanen.
Ini berasal dari kasus penggunaan yang sebenarnya, di mana saya perlu memanggil yui-compressor pada beberapa file yang dibuat oleh wintersmith, tetapi tinggalkan file lain yang perlu dikirim apa adanya.
Catatan [1] :Jika Anda ingin mengecualikan /tmp/foo/bar
dan Anda menjalankan find seperti ini "find /tmp \(...
" maka Anda harus menentukan -path /tmp/foo/bar
. Sebaliknya, jika Anda menjalankan find seperti ini cd /tmp; find . \(...
maka Anda harus menentukan -path ./foo/bar
.