Ls'nin grep yapmasını ve grep tarafından filtrelenen dosyaları nasıl silerim?


33

Ana dosyamdaki bir paketi silmek istedim, ancak dosya adı çok uzundu ( google-chrome-stable_current_i386.deb). Bu nedenle, ls|grep chrome|rmchrome dosyasını filtrelemek üzere greplemek için dosyaları yönlendirmek için komutu kullanmaya karar verdim ve sonra onu kaldırdım. İşe yaramadı, bu yüzden bunu nasıl yapabildiğimi görmek istiyorum.


22
rm -i *chrome*.deb
Lambert,

28
Genel olarak konuşursak, insanların "bunu yapma" mesajını vermesinden hoşlanmıyorum cevaplar, ancak bu şimdiye kadar gördüğüm bir XY probleminin en iyi örneklerinden biri . Asıl sorunuz "uzun bir dosya adı olan bir dosyayı, her şeyi yazmadan hızlıca nasıl silebilirim" ve çıktıyı elden geçirmeyi içermeyen birçok iyi yol vardırls
Michael

5
Sadece kullan find- find . -name "*chrome*" -delete.
Örümcek Boris,


3
Bir StackExchange kullanıcısı olarak yaptığım iki kuruş: Gelecekte, sorunuzu daha genel bir şekilde sormaya çalıştığınızdan emin olun. "Dosya adında belirli bir dizeyle bir klasördeki dosyaları nasıl silebilirim?" bunu ifade etmenin daha iyi bir yolu olabilirdi. Sonra basitçe boru çalıştı, bir kenara, ekleyebilirsiniz lsaracılığıyla grepetmek rmama işin o alamadım. Bu şekilde, birisini size verimsiz bir çözüm hakkında iyi bir cevap vermeye zorlamak yerine, görevinizi başarmanın "doğru" veya "en kolay" yolu hakkında bir veya iki iyi cevap alırsınız.
Adrian,

Yanıtlar:


56

Bu neredeyse beni mahvetti.

  1. O av tüfeğini ayağınıza doğrultmayı bırakmak isteyebilirsiniz . Temel olarak, herhangi bir ayrıştırma türü, glob'lar veya küreler gibi yerleşik yöntemlerden lsdaha karmaşık ve hataya açık olacaktır .find [...] -exec
  2. Birisi sizin için bir troll dağıtımı yüklemezse, kabuğunuzun Tabtamamlanması gerekir. Sadece yazıp rm googletuşuna basın Tab. Hemen tamamlanamazsa Tab, eşleşen dosyaların listesini görmek için tekrar basın . Dosya adının daha fazla karakterini, tamamlanana kadar daraltmak için yazın, sonra komutu çalıştırın.
  3. Borular ! = Parametreler . Standart giriş, bir komuta eşzamansız olarak beslenebilen bir ikili veri akışıdır . Parametreler, çalıştırılırken bir komuta yalnızca bir kez ve bir defa iletilen boşlukla ayrılmış dizelerdir. Bunlar çok nadiren birbirlerinin yerine geçebilir.

1
Bir n00b sorusu gibi görünüyorsa üzgünüm. Belirtilen paket içinde belirtilen "krom" olan tek paket olduğundan, genel olarak kullanmanın uygun olmadığını biliyordum. Bu nedenle, grep kullanmak sadece bir dosyayı filtreleyecektir. Linux için oldukça yeniyim ve zaten birçok bash betiği yaptım, fakat henüz her şeyi bilmiyorum: P. Sert, dostum.
SpecialBomb

5
Sert olmak istememişti, ancak kabuk, kullanıcı dostu bir yüzeyin arkasına gizlenmiş sert ve affedilmez bir ortamdır. İşleri güvenli bir şekilde yapmak yeterince zordur, güvenli ve hatta doğru şekilde aldırma .
l0b0

2
@SpecialBomb Bu tek doğru cevap. Bahsedilen av tüfeğinin bir ayağını temiz bir şekilde kesmeyi doğru hedeflemenin açıklanması, diğer cevapların yaptığı gibi, kesinlikle gitmenin yolu değildir. Özellikle kör uygulamada dikkatli olun rm- bu, dağıtımınızı kızartmanın tek daha yaygın yoludur.
Örümcek Boris,

@BoristheSpider Heh, ben zaten zaten iki kez AMD grafik kartı sürücüleri yükleyerek Ubuntu kızartılmış. Bu konuda zaten bir soru sordum. AMD korkunçtu, bu yüzden bir AMD kartta Linux ile ortak bir düzeltme veya daha iyi oyun yöntemleri olup olmadığını sordum.
SpecialBomb

34

Find komutunu bir joker karakterle de kullanabilirsiniz:

find . -maxdepth 1 -name '*chrome*' -delete

"-Maxdepth" argümanının, bulmanın yalnızca geçerli dizinde çalışmasını sağladığını ve alt dizinlerde tekrarlanmadığını unutmayın.


1
İyileştirmeler için öneriler: (a) büyük / -inameküçük harfe duyarsız dosya adları (b) için bayrak ve bayrak xargskullanma borusu kullanın . Kullanımı "etkileşimli" (onayla silme gibi şeyler yapmak için izin verir ?) Siler. -print0find-0xargsxargsfoo
Christopher Schultz

3
-Exec seçeneğini kullanırsanız xargs'a boru kullanmanıza gerek yok:find . -name '*chrome*' -exec rm -i {} +
Johnny,

4
Bu aynı zamanda özyinelemeli alt dizinlere silinmez mi? 1 olarak belirtmeniz gerekebilir maxdepth.
Tyzoid

32

Doğru fikrin vardı, sadece bazı detayları kaçırdım. STDIN’e gelen bir liste ile ilgilendiğinizdenrm parametreleri beklediğiniz için kullanmanız gerekir xargs.

Böylece:

ls | grep chrome | xargs rm

Sana istediğini vermelisin.

chromeDosyadan başka bir şey silmek istiyorsanız, dosyaya kolayca ekleyebilirsiniz -v.grep açıklamada.

Bu sorunun diğer cevaplarına göre, başarmak istediğinizi başarmanın muhtemelen kötü bir yol olduğunu unutmayın.


Bu -v, eşleşen dosyalar dışında her şeyi silmez chromemi? OP'nin istediği şeyin bu olduğunu sanmıyorum ...
akivajgordon

Tekrar bakarsak haklısın. OP, "chrome dosyasını filtrelemek" istiyor, ancak sonra kaldırmak istiyor.
John

Bu, basit bir "rm-i krom " ile karşılaştırıldığında gereksiz yere karmaşık görünüyor
Aralık'ta

5
Kabul edilen cevap işe yarıyor, ancak bunun neden kötü bir fikir olduğunu açıklayan aşağıdaki cevaba bakınız. (Bu yorumu buraya yalnızca "kabul edilmiş" bir onay işareti gördüklerinde durmayanların uğruna yayınlamak.)
Jim Davis

1
Bu, kabul edilen cevap , çıktıda "tuhaf" bir dosya adı yoksa "işe yarar"ls . Boşluk içeren dosya isimleri bunu mahvedecektir. Bu, birisinin bunu çalıştırdığınız dizinde özel soslu bir dosya adı oluşturabilmesi durumunda da tehlikelidir . Birden fazla kişinin işaret ettiği gibi, ls'nin çıktısını çözümlemeyin !
Stephen P,

11

Asla ls'nin çıkışını ayrıştırma
Önerim, ls [ 1 ] ' in çıkışını ayrıştırmamaktan kaçınmaktır .del komut . Bu, pek çok nedenden ötürü, genellikle beklenmedik ve dosya adına izin verilen olağan olmayan karakterlerle ilgilidir.

Linux paketlerine ait dosya adlarının "iyi davranacağını" beklemeniz durumunda bile , bu dosya aynı dizinde başka dosyalar varsa, ancak bilmediyseniz veya farketmediyseniz görünebilir.

findSekme genişletmesi (adı yazmaya ve basmaya başla Tab), dosya adı genişletme [ 2 ] olarak kullanmak daha iyidir *MyKey*...


Hızlı bir çözüm İçinde "google" bulunan
tüm paketleri (tamamlanmış .deb) seçmek istediğinizden , joker karakter ile isteğinizi oluşturabilir ve basit bir işlem yapabilirsiniz.* *google*.deb

rm -i *google*.deb 

her seçecektir dosya adı ile "google" için bitecek ortada .debgeçerli dizinde mevcut. Seçenek -i(etkileşimli) onay ister, parametre genişletmeli dosyaları sildiğinizde iyi bir alışkanlık olur.


Denemenizin felsefesine yakın bir çözüm
Amacınız komut satırı parçanızı parçadan sonra oluşturmaksa, bunu yaptınız ls, sonra ls | grep googleve yalnızca çıktınızı kontrol ettikten sonra bunu bir alt kabukta uygulayabilirsiniz $(...).

rm -i $(ls | grep google)

Daha hızlı ve daha tehlikeli bir yol [ 3 ] kullanmaktır!!

ls | grep google
rm -i $(!!)

Bu geçmişinde biten son komutu yürütecek . Sen sen önceden kabuk seçenekleri etkinleştirdiyseniz yürütmek edeceklerini hattının hiçbir görsel kontrole sahip olmasından korunabilirsiniz histverifyile shopt -s histverify.


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... -name '*c*.deb'yerine ya da size uygun olan başka bir desen kullanın.


2

rmgelen girişi kabul etmiyor stdin. Gibi bir şey yapmanız gerekecekls google-chrome* | xargs 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.