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.


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.


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


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 .


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
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.