-deletemenyiratkan -depthbahwa tidak bekerja dengan -prune( -depthdimulai dengan daun). Ada peringatan tentang hal itu di manual versi GNU ( -deleteadalah ekstensi FreeBSD sekarang juga didukung oleh GNU finddan beberapa implementasi lainnya).
info find --index-search=-delete
Penggunaan tindakan '-delete' pada baris perintah secara otomatis mengaktifkan opsi '-depth' (* note find Expressions: :). Ini bisa mengejutkan jika Anda sebelumnya hanya menguji dengan '-print', jadi biasanya yang terbaik adalah ingat untuk menggunakan '-depth' secara eksplisit.
info find --index-search=-prune
Karena '-delete' menyiratkan '-depth', menggunakan '-prune' dalam kombinasi dengan '-delete' dapat mengakibatkan penghapusan lebih banyak file daripada yang Anda inginkan.
Di sini, Anda memiliki pilihan untuk menggunakan rm:
find . -name save -prune -o -type f -exec rm -f {} +
(berpotensi tidak aman jika ada direktori yang dapat ditulisi oleh orang lain di sana, karena orang dapat membuat Anda menghapus file di luar pohon direktori saat ini dengan mengganti direktori dengan symlink saat Anda menjalankan perintah itu).
Alternatif yang lebih aman:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
Itu tidak memiliki masalah yang disebutkan di atas tetapi berarti menjalankan satu rmper file. The --diperlukan untuk pelaksanaan FreeBSD, bukan GNU yang awalan nama file dengan ./.
Atau, seperti yang disarankan oleh Costas:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(tapi itu masih sia-sia masuk ke savedirektori)
Apakah LC_ALL=Cada sehingga *cocok dengan urutan byte (bahkan yang tidak membentuk karakter yang valid di lokal saat ini). Perhatikan bahwa ini akan memengaruhi bahasa pesan kesalahan (Bahasa Inggris alih-alih bahasa pengguna).
mv save/ ../some/safer/locationsebelum perintah penghapusan "generik" (... tapi tentu saja, sebelum posting Anda, saya akan melakukan pemeriksaan yang sama dan mengalami masalah yang sama!). Sekarang, cari "undelete" yang bagus untuk sistem file tempat file ^^