ls | grep | rm - Bu komut nasıl biçimlendirilir?


11

Belirli bir dizindeki bir grup dosyayı silmeye çalışıyorum (Terminal kullanarak Mac OS X'te)

ls | grep \([1-9]\) | xargs rm

hile yapmalı, ama yapmaz. Ben dosya adında parantez içinde tek bir rakam ile herhangi bir dosyayı (web kopyaları indirilen) silmeye çalışıyorum, ama böyle bir şey yapıyor sona erer:

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

çünkü mekanı doğru yorumlamıyor. "520syllabus2010 (3) .pdf" dosyasını silmelidir.

Bunu yapmanın uygun yolu nedir?

Teşekkürler, Jeff


1
Örnek dosya adınız değişmez bir bilgi içermiyor #.
Benjamin Bannier

1
@honk: Bir kelime aramıyor #.
Ignacio Vazquez-Abrams

1
Kabuğun genişlemesi nedeniyle, cwd'nin örn (3). En iyisi, kabuğun onları etkilememesi için bağımsız değişkenler belirtmektir.
Ignacio Vazquez-Abrams

Yanıtlar:


19

Kısa versiyon:

rm *\([1-9]\)*

Değil boruyu Do lsiçin xargs. Bunun yerine, boru find ... -print0etmek xargs -0, sırayla tür sorunları önlemek için.

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... şu şekilde yazılabilir:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

ve:

find . -maxdepth 1 -name '*([1-9])*' -delete

sadece rmjoker karakterle kısaltılabilir .


Normalde lsve finddosya adlarını yeni satırlarla ayırın, ancak xargsgirdisini yeni satıra veya boşluğa böler ve bu da gördüğünüz davranışla sonuçlanır.

Sadece xargsyeni satıra göre bölünmeyi söylemek mümkündür , ancak dosyaların adlarında da yeni satırlar olabilir . Aslında, Linux ve BSD üzerinde, sadece izin verilmeyen karakter olan "boş" ya da sıfır bayt - bu gibi durumlarda kullanması gereken budur böylece.

Yukarıdaki Örnek 2'de, -print0anlatır findboş bir bayt ile ayrı dosya için; için aynı xargs -0. (Birkaç başka araçta sort -zveya gibi benzer seçenekler bulunur grep -zZ.)

"Kısa versiyon" basit bir kabuk joker karakter kullanır ( bashkılavuzda "desen" - bkz . "Yol Adı Genişletme" bölümü).


1
Ve sadece güvenli olmak için *" "\\([1-9]\\).*, (a, adil olmak için) döneminden önce yalnızca paren'd sayısından önce boşluklu dosyaların silinmesi için kullanmak daha iyidir .
Ignacio Vazquez-Abrams

Bu sözdizimine çok aşina değilim, ancak upvotes'a dayanarak denedim ve ne biliyorsunuz ... işe yaradı! Teşekkürler!
Jeff

1
+1. -print0, xargs'a doğru borular için çok önemlidir.
Chris W. Rea
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.