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 .