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.


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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.