Piping find -name to xargs menghasilkan nama file dengan spasi yang tidak diteruskan ke perintah

26

Biasanya untuk menghapus file dengan spasi di nama file Anda, Anda harus menjalankan:

$ rm "file name"

tetapi jika saya ingin menghapus banyak file, misalnya:

$ find . -name "*.txt" | xargs rm

Ini tidak akan menghapus file dengan spasi di dalamnya.

Ashley
sumber
Tebakan lengkap di sini: apakah find -name "*\ *.txt" | xargs rmberfungsi untuk dua file kata?
TheWanderer

Jawaban:

49

Anda dapat memberitahu finddan xargsuntuk keduanya menggunakan terminator nol

find . -name "*.txt" -print0 | xargs -0 rm

atau (lebih sederhana) gunakan -deleteaksi bawaanfind

find . -name "*.txt" -delete

atau (terima kasih @kos)

find . -name "*.txt" -exec rm {} +

salah satunya harus menghormati batas sistem ARG_MAXtanpa perlu xargs.

Steeldriver
sumber
1
Tidak dapat mengangkatnya dua kali lebih sulit :) karena Anda menyebutkan ARG_MAXsaya juga akan menyebutkan bahwa itu find . -name "*.txt" -exec rm {} \;akan menjadi "tembakan yang aman"
kos
3
Demikian sayeth master: selalu ingat xargs -0.
Joshua
1
Poin super penting: -print0harus menjadi opsi terakhir (atau setidaknya setelah -name "*.txt") jika tidak,*.txt file ini tidak akan lagi terbatas pada ...
Kev
1

Kebetulan, jika Anda menggunakan sesuatu selain menemukan, Anda dapat menggunakan tr untuk mengganti baris baru dengan byte nol.

Misalnya. liner berikut menghapus 10 file yang terakhir dimodifikasi dalam direktori, bahkan jika mereka memiliki spasi dalam namanya.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm

Ibrahim
sumber
Yap, ini berhasil.
Peter Mortensen
0

Perintah xargs menggunakan tab, spasi, dan baris baru sebagai pembatas secara default. Anda bisa mengatakannya untuk hanya menggunakan karakter baris baru ('\ n') dengan opsi -d:

find . -name "*.txt" | xargs -d '\n' rm

Sumber jawaban di SO .

joseph_morris
sumber
Jawaban itu menyebutkan -0bukannya -d(untuk xargs) untuk sistem BSD. Apa yang digunakan Ubuntu? Jawaban yang diterima di sini menggunakan -0. Apa yang benar
Peter Mortensen