Xargs ile argüman alıntılama


15

Bir klasördeki 1 MB'den büyük tüm dosyaları silmek istediğimi varsayalım.

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

Bu, adlarında boşluk olan dosyaları silmez. Bu yüzden gönderdiği tüm argümanları alıntılamasını istiyorum rm. Eğer findverir Some report.docxo geçmelidir "Some report.docx"için rm.

Bunu nasıl yapabilirim?


1
Herhangi bir şey yapmadan önce bu mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 bölümünü okumalısınız xargs. Wiki anlaşılacağı gibi Ayrıca kullanmayın xargsgeçirmeden -print0için find.
Valentin Bajrami


xargs -d$'\n'Sınırlayıcıyı yalnızca yeni satırlarla sınırlamak için kullanın (boşluklar değil; tırnak işaretleri vb. Özel olarak işlemez - bir GNU sisteminde kontrol ettim) - stackoverflow.com/a/33528111/94687'de
imz - Ivan Zakharyaschev

Yanıtlar:


13

Basit kullanım:

find . -size +1M -delete

Kullanmak için xargsve rmile ısrar ediyorsanız find, sadece -print0komutunuzu ekleyin :

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

Diğer yol:

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

Gönderen 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.

3
Bu sorunu çözer, ancak argümanlardan alıntı yapmak diğer durumlarda yararlı olacaktır. Bu yüzden diğer cevaplar için beklemeye devam edeceğim. Basit bir çözüm için +1.
Kshitiz Sharma

2
@KshitizSharma Hayır, geçmek istemiyoruz "Some report.docx"için rmdosya adı tırnak içermediği sürece,. İstediğin şey Some report.docxhaksız yere geçmek rm. KasiyA'nın cevabı (şimdi) bunu yapmanın genel yolunu gösteriyor find. [KasiyA: daha önce yanlış ping için özür dilerim.]
Gilles 'SO- kötü olmayı bırak'

@Gilles Doğru. Bash'da genellikle ipi, asılsız geçmek için alıntılarım. Demek istediğim alıntı yaparak, dosya $0$1
adını rm'ye

OSX'de xargs -0bunun yerine yaparım xargs -r0.
Rolf

8

İsteğe bağlı -0bir xargsboru çıkışı boş sonlandırılmış öğeleri olarak yorumlanır olduğu anlamına gelir. Bu durumda, ile boru için giriş oluşturmanız gerekir find ... -print0.


6

Benzer bir gereksinim vardı ve -Ibir yer tutucu için anahtarı kullanarak sona erdi ve ben teklif edebildi.

find . -size +1M | xargs -I {} rm "{}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.