Saya memiliki kode berikut ini:
find ./ -iname '*phpmyadmin' -exec rm -rf {} \;
Menghapus dir yang dipanggil phpmyadmin
, tetapi tidak menghapus file yang dipanggilphpMyAdmin-Version-XYZ.zip
Bahkan jika saya menghapus -rf
, masih tidak akan menghapusnya (mungkin karena masalah kedua dengan -iname tidak mempengaruhi ketidakpekaan huruf besar-kecil).
- Apakah ada cara untuk menghapus inode dalam satu rm (file, dir, softlink)?
- Mengapa menambahkan
-iname
tidak berpengaruh?
Catatan: Saya tidak menemukan argumen "delete anyode" di man rm
.
find
mendukungnya, coba-delete
tindakannya. (Juga, lihat gnu.org/software/findutils/manual/html_node/find_html/… untuk diskusi ekstensif tentang banyak cara untuk melakukan hal ini secara tidak benar.)Jawaban:
Masalahnya adalah bahwa Anda mencocokkan file yang berakhir dengan
phpmyadmin
( case-insensitive ) dengan menggunakan pola*phpmyadmin
. Untuk mendapatkan file apa pun yang berisi stringphpmyadmin
(case-insensitive), gunakan-iname '*phpmyadmin*'
:Mungkin mendapatkan file yang cocok sebelum dihapus akan menjadi waras:
Untuk menjawab pertanyaan pertama Anda, tidak ada opsi di
rm
dalam userspace untuk berurusan dengan inode.sumber
-depth
sehinggafind
tidak mencoba untuk kembali ke direktori itu baru saja dihapus.find
sebelum menambahkan-exec
parameter. Sangat berbahaya.-exec rm -rf {} +
- tidak ada titik hukuman kinerja menjalankan saturm
per file.Ini berfungsi bahkan jika seseorang membuat direktori -phpmyadmin.
sumber
./
, jadi itu tidak diperlukan: itu akan dijalankanrm -rf ./-phpmyadmin
, yang seharusnya bisa digunakan dengan waras apa punrm
. Cobalahfind ./ -iname '*whatever*' -exec echo '{}' ';'
untuk mengujifind */
alih-alihfind .
, itu akan melakukannya (jika nama direktori yang cocok dimulai dengan tanda hubung). Yang mengatakan, saya akan cenderung menyarankan menggunakan--
untuk menangani kasus tersebut dengan menyediakan end-of-pilihan eksplisit sebelum itu{}
argumen. (Lihat # 10 dalam pedoman sintaks utilitas POSIX ).{} +
jauh lebih efisien daripada{} \;
, karena hanya akan menjalankan banyak contoh dari perintah Anda (nuke
dalam hal ini) yang diperlukan untuk mencocokkan semua item yang ditemukan pada baris perintah, dibandingkan dengan satu per masing-masing.find */
maka masalah tidak akan terjadi di-exec
, direktori dengan tanda hubung akan muncul menjadifind
pilihan dan itu akan mengeluh.