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.