-delete
menyiratkan -depth
bahwa tidak bekerja dengan -prune
( -depth
dimulai dengan daun). Ada peringatan tentang hal itu di manual versi GNU ( -delete
adalah ekstensi FreeBSD sekarang juga didukung oleh GNU find
dan 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 rm
per 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 save
direktori)
Apakah LC_ALL=C
ada 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/location
sebelum 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 ^^