Saya ingin menghapus semua file yang berisi string foo
. Bagaimana saya bisa melakukan ini menggunakan bash di Linux?
linux
command-line
bash
find
Kitsos
sumber
sumber
foo
(misalnyamyfoo.jpg
), atau file yang berisi urutan bytefoo
(yang mungkin termasuk file biner yang kebetulan mengandung urutan byte itu)?Jawaban:
Ini cara yang aman:
-l
mencetak nama file dari file yang cocok dengan pola pencarian.-r
melakukan pencarian rekursif untuk polafoo
di direktori yang diberikan.
. Jika ini tidak berhasil, coba-R
.-I
(modali
) menyebabkan file biner seperti PDF dilewati.-Z
memastikan bahwa nama file nol- (yaitu, nul-) diakhiri sehingga nama yang mengandung spasi tidak ditafsirkan dengan cara yang salah (yaitu, sebagai beberapa nama, bukan satu).xargs -0
mengumpankan nama file darigrep
menjadirm -f
, memisahkan kata dengan nol (nul) byte (ingat-Z
opsi darigrep
).--
sering dilupakan tetapi sangat penting untuk menandai akhir opsi dan memungkinkan penghapusan file yang namanya dimulai-
.Jika Anda ingin melihat file mana yang akan dihapus, cukup hapus
| xargs -0 rm -f --
bagian itu, dan tinggalkanZ
opsi untukgrep
.Pengguna lain menyarankan sesuatu seperti yang berikut, yang tidak boleh Anda jalankan karena tidak aman:
Jika saya memiliki file
ImportantStuff
yang saya tidak ingin hapus danobsolete ImportantStuff
mengandungfoo
, maka saya kehilanganImportantStuff
(dan tidakobsolete ImportantStuff
!) Ketika saya menjalankan perintah ini, karena$files
rusak di ruang ketika ditafsirkan. Berbahaya memasukkan daftar nama file ke dalam variabel skalar shell dengan cara ini.sumber
Ini secara rekursif mencari file yang mengandung
foo
. Yang kedua-exec
hanya berjalan jika yang pertamaexec
berhasil, yaitu jikagrep
cocok. Dryrun dan hapusecho
jika output tampaknya benar.Atau sebagai alternatif
dan
seperti yang disarankan oleh Lekensteyn.
sumber
find -type f -exec grep -q 'foo' {} \; -delete
(tanda kutip di sekitarnya{}
berlebihan,find
juga dapat menghapus file.). Perhatikan bahwagrep
menerima ekspresi reguler. Jika Anda ingin mencarifoo.bar
, lepas ini atau lewat-F
opsi untuk memperlakukan pola sebagai literal.-exec echo rm "{}" \;
dan tidak-delete
?-delete
. Lebih mudah untuk menunjukkan dengan yang kedua-exec
dan menggema di tempat.-print
(atau-ls
untuk lebih banyak kata) daripada-exec echo rm "{}" \'
. Tidak perlu utilitas eksternal.Saya akan melakukan apa yang dikatakan Adrian,
Tapi saya akan menambahkan batas kata di foo foo agar tidak sengaja menghapus file yang berisi "makanan" (kecuali itu menghapus semua yang mengandung makanan adalah apa yang Anda inginkan.)
secara akut, saya akan mengarahkan output sebelum menghapus sehingga saya bisa meninjau sebelum menghapus:
sumber