Bagaimana cara menggunakan perintah find untuk menghapus file yang cocok dengan suatu pola?

17

Saya mencoba menulis perintah bash yang akan menghapus semua file yang cocok dengan pola tertentu - dalam hal ini, itu semua file log vmware lama yang telah dibangun.

Saya sudah mencoba perintah ini:

find . -name vmware-*.log | xargs rm

Namun, ketika saya menjalankan perintah, itu tersedak pada semua folder yang memiliki spasi dalam namanya. Apakah ada cara untuk memformat path file sehingga xargs meneruskannya ke rm yang dikutip atau lolos dengan benar?

Dan Monego
sumber
Diposting silang: stackoverflow.com/questions/1590297/…
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

20

Saya biasanya menemukan bahwa menggunakan -execopsi untuk findmenjadi lebih mudah dan tidak membingungkan. Coba ini:

find . -name vmware-*.log -exec rm -i {} \;

Semuanya setelah -execdiambil menjadi perintah untuk menjalankan untuk setiap hasil, hingga ;, yang lolos di sini sehingga akan diteruskan ke find. The {}diganti dengan nama file yang findbiasanya akan mencetak.

Setelah Anda memverifikasi itu melakukan apa yang Anda inginkan, Anda dapat menghapus -i.

Jeff Snider
sumber
1
Juga, jika itu hanya file yang ingin Anda hapus dan bukan direktori, Anda bisa menambahkan '' -type f '' ke perintah find.
JamesHannah
18

Jika Anda memiliki GNU, findAnda dapat menggunakan -deleteopsi:

find . -name "vmware-*.log" -delete

Untuk menggunakan xargsdan menghindari masalah dengan spasi dalam nama file:

find . -name vmware-*.log -print0 | xargs -0 rm

Namun, file log Anda seharusnya tidak memiliki spasi dalam namanya. Dokumen pengolah kata dan file MP3 mungkin memilikinya, tetapi Anda harus dapat mengontrol nama file log Anda.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Itu rapi. Saya tidak tahu tentang itu.
Jeff Snider
8

Anda dapat memberitahu finduntuk membatasi daftar output dengan NULLs, dan xargsuntuk menerima daftar inputnya sama:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Selain itu, pastikan Anda lolos dari *, baik dengan backslash, atau dengan memuat vmware-*.logtanda kutip tunggal, jika tidak, shell Anda dapat mencoba memperluasnya sebelum meneruskannya find.

James Sneeringer
sumber
6

Jangan lupa opsi temukan -delete. Ini menghapus file tanpa kesalahan dengan karakter khusus ...

Dom
sumber