Cara mengutip argumen dengan xargs

15

Misalkan saya ingin menghapus semua file dalam folder yang lebih besar dari 1 MB.

$ find . -size +1M | xargs -0 rm

Ini tidak akan menghapus file yang memiliki ruang dalam namanya. Jadi saya ingin mengutip semua argumen yang dikirimkannya rm. Jika findmemberikan Some report.docxitu harus lulus "Some report.docx"untuk rm.

Bagaimana saya bisa melakukan itu?

Kshitiz Sharma
sumber
1
Anda harus membaca ini mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 sebelum melakukan sesuatu dengan xargs. Juga seperti yang disarankan wiki, jangan gunakan xargstanpa melewati -print0to find.
Valentin Bajrami
1
Secara lebih umum, lihat Mengapa skrip shell saya tercekik di spasi putih atau karakter khusus lainnya?
Gilles 'SANGAT berhenti menjadi jahat'
Gunakan xargs -d$'\n'untuk membatasi pembatas hanya untuk baris baru (dan bukan spasi; ini tidak akan memproses tanda kutip, dll. Khusus - Saya telah memeriksa sistem GNU) - jawaban yang diberikan dalam stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

Jawaban:

13

Penggunaan sederhana:

find . -size +1M -delete

Jika Anda bersikeras menggunakan xargsdan rmdengan find, tambahkan saja -print0perintah Anda:

find . -size +1M -print0 | xargs -r0 rm --

Cara lain:

find . -size +1M -execdir rm -- {} +

Dari man find:

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.
αғsнιη
sumber
2
Ini menyelesaikan masalah tetapi sebenarnya mengutip argumen akan berguna dalam kasus lain. Jadi saya akan menunggu jawaban lain. +1 untuk solusi sederhana.
Kshitiz Sharma
2
@KshitizSharma Tidak, Anda tidak ingin melewatkan "Some report.docx"untuk rm, kecuali nama file berisi tanda kutip. Yang Anda inginkan adalah lulus Some report.docxtanpa gangguan rm. Jawaban KasiyA (sekarang) menunjukkan cara umum untuk melakukan itu find. [KasiyA: maaf untuk ping yang salah sebelumnya.]
Gilles 'SO- stop being evil'
@Gilles Benar. Dalam bash saya biasanya mengutip string untuk meneruskannya tanpa gangguan. Jadi dengan mengutip apa yang saya maksudkan adalah mengirim nama file sebagai argumen tunggal ke rm bukannya dipisahkan menjadi $0dan $1lain
Kshitiz Sharma
Pada OSX saya lakukan xargs -0bukan xargs -r0.
Rolf
8

Pilihan -0dari xargsberarti bahwa output dari pipa ditafsirkan sebagai null dihentikan item. Dalam hal demikian, Anda juga perlu membuat input untuk pipa find ... -print0.

jimmij
sumber
5

Saya memiliki persyaratan yang sama dan akhirnya menggunakan -Isakelar untuk memiliki pengganti dan saya dapat mengutipnya.

find . -size +1M | xargs -I {} rm "{}"
dee-see
sumber