Mengapa tidak menemukan / rm -iname '* phpmyadmin' delete phpMyAdmin-Version-XYZ.zip?

8

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).

  1. Apakah ada cara untuk menghapus inode dalam satu rm (file, dir, softlink)?
  2. Mengapa menambahkan -inametidak berpengaruh?

Catatan: Saya tidak menemukan argumen "delete anyode" di man rm.

derobert
sumber
1
Jika Anda findmendukungnya, coba -deletetindakannya. (Juga, lihat gnu.org/software/findutils/manual/html_node/find_html/… untuk diskusi ekstensif tentang banyak cara untuk melakukan hal ini secara tidak benar.)
zwol

Jawaban:

31

Masalahnya adalah bahwa Anda mencocokkan file yang berakhir dengan phpmyadmin( case-insensitive ) dengan menggunakan pola *phpmyadmin. Untuk mendapatkan file apa pun yang berisi string phpmyadmin(case-insensitive), gunakan -iname '*phpmyadmin*':

find ./ -iname '*phpmyadmin*' -exec rm -rf {} \;

Mungkin mendapatkan file yang cocok sebelum dihapus akan menjadi waras:

find ./ -iname '*phpmyadmin*'

Untuk menjawab pertanyaan pertama Anda, tidak ada opsi di rmdalam userspace untuk berurusan dengan inode.

heemayl
sumber
1
Sangat mungkin harus mempertimbangkan -depthsehingga findtidak mencoba untuk kembali ke direktori itu baru saja dihapus.
roaima
8
Bukan untuk mengambil apa pun dari jawabannya, yang termasuk di dalamnya, tetapi hanya ingin menekankan bahwa alasan bahwa perintah OP tidak menghapus file zip adalah karena tidak menemukannya , karena kurangnya jejak '* 'pada polanya.
Gwyn Evans
3
@ GwynEvans Itu juga berarti dari OP tidak menguji findsebelum menambahkan -execparameter. Sangat berbahaya.
Tulains Córdova
Mungkin menyarankan -exec rm -rf {} +- tidak ada titik hukuman kinerja menjalankan satu rmper file.
Charles Duffy
2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Ini berfungsi bahkan jika seseorang membuat direktori -phpmyadmin.

Joshua
sumber
Temukan (setidaknya di sini) awalan nama-nama itu ./, jadi itu tidak diperlukan: itu akan dijalankan rm -rf ./-phpmyadmin, yang seharusnya bisa digunakan dengan waras apa pun rm. Cobalah find ./ -iname '*whatever*' -exec echo '{}' ';'untuk menguji
derobert
@derobert: Saya sudah mengacaukannya di beberapa kesempatan. Setelah digigit, dua kali malu-malu. Mungkin itu hanya bisa terjadi jika argumen untuk menemukan adalah sesuatu seperti '-annoyingdirectoryname'.
Yosua
1
Jika seseorang berlari, katakanlah, find */alih-alih find ., 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 ).
Charles Duffy
1
Sebagai tambahan - {} +jauh lebih efisien daripada {} \;, karena hanya akan menjalankan banyak contoh dari perintah Anda ( nukedalam hal ini) yang diperlukan untuk mencocokkan semua item yang ditemukan pada baris perintah, dibandingkan dengan satu per masing-masing.
Charles Duffy
@CharlesDuffy Jika mereka berlari find */maka masalah tidak akan terjadi di -exec, direktori dengan tanda hubung akan muncul menjadi findpilihan dan itu akan mengeluh.
Barmar