Linux'ta Bash'de birden fazla dosya aynı anda nasıl silinir?


103

Bir Linux sunucusunda şu dosya listesine sahibim:

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

rm -rfAşağıdaki komutu kullanarak seçili günlük dosyalarını tek tek siliyorum:

rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

Seçili dosyaları bir kerede silmemin başka bir yolu var mı?


4
Ve "Sadece Linux değil, GNU / Linux deyin", arka koltuklardan birilerinin gürlediğini duyuyorum.
Boris Stitnicky

8
Bu arada, neden -rf? Bunlar klasörler mi? f zorlamaktır, r özyinelemeli içindir. Yalnızca bir dosyaysa işe yarayacaktır, ancak bir şeyi silmek istediğiniz her seferde -rf çok (çok) (çok çok) tehlikelidir. (ve "linux" çok geniş olduğu için "bash" etiketini eklemelisiniz.
Depado

@BorisStitnicky - Neden GNUgerekli olduğunu merak ediyorum ?
user66001

2
@ user66001: GNU projesinin konuyla ilgili görüşü için: gnu.org/gnu/linux-and-gnu.html . En azından burada değil, konuyla ilgili hiçbir pozisyon almak ve bu değil bunu tartışmaya yer.
Keith Thompson

2
@BorisStitnicky - Tartışmaya gerek yok, tamamen ipucu yoktu ve bu bağlantı bana aradığım bilgi düzeyini verdi +1
user66001

Yanıtlar:


160

Bash, her tür joker karakter ve genişletmeyi destekler.

Tam durumunuz aşağıdaki gibi küme ayracı genişletmesiyle ele alınacaktır :

$ rm -rf abc.log.2012-03-{14,27,28}

Yukarıdakiler, üç bağımsız değişkenle birlikte tek bir komuta genişler ve yazmaya eşdeğerdir:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

Bu genişletmenin, rmyüklenmeden önce kabuk tarafından yapıldığına dikkat etmek önemlidir .


Dosyaları ileride geri yüklemek istiyorsanız "rm" kullanmayın. "Rm-trash" yardımcı programını kullanabilirsiniz: github.com/nateshmbhat/rm-trash
Natesh bhat

76

*Birden çok dosyayı eşleştirmek için bir joker karakter ( ) kullanın.

Örneğin, aşağıdaki komut, ile başlayan tüm dosyaları silecektir abc.log.2012-03-.

rm -f abc.log.2012-03-*

Komutu ls abc.log.2012-03-*çalıştırmadan önce neyi sileceğinizi görebilmeniz için dosyaları listelemek için çalıştırmanızı öneririm rm.

Daha fazla ayrıntı için, dosya adı genişletmeyle ilgili Bash man sayfasına bakın .


Çok kullanışlı, ancak silmek için onay istemiyor. Lütfen unutmayın.
nuriselcuk

1
@nuriselcuk, silinen her dosya için onay almak için -i ekleyebilirsiniz.
Felipe Romero

Amazon Linux 1 çalıştıran AWS Ec2-Instance üzerinde bir cazibe gibi çalıştı :) Teşekkür ederiz.
Kyle Bridenstine

41

İsimleri belirli bir formla eşleşen tüm dosyaları silmek istiyorsanız, bir joker karakter (glob kalıbı) en basit çözümdür. Bazı örnekler:

$ rm -f abc.log.*             # Remove them all
$ rm -f abc.log.2012*         # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]*  # Remove all files from the first quarter of 2012

Normal ifadeler joker karakterlerden daha güçlüdür; Eğer çıktısını besleyebilir grepiçin rm -f. Örneğin, dosya adlarından "abc.log"bazıları ile başlayıp bazıları ile başlıyorsa "ABC.log", büyük / grepküçük harfe duyarlı olmayan bir eşleştirme yapmanıza izin verir:

$ rm -f $(ls | grep -i '^abc\.log\.')

Dosya adlarından herhangi biri boşluklar dahil komik karakterler içeriyorsa bu sorunlara neden olur. Dikkatli ol.

Bunu yaptığımda, önce ls | grep ...komutu çalıştırıyorum ve istediğim çıktıyı üretip üretmediğini kontrol ediyorum - özellikle de şunu kullanıyorsam rm -f:

$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)

nerede !!önceki komuta genişler. Veya yukarı-ok veya Ctrl-P yazabilir ve rm -fkomutu eklemek için önceki satırı düzenleyebilirim .

Bu, bash kabuğunu kullandığınızı varsayar. Bazı diğer kabuklar, özellikle csh ve tcsh ve bazı eski sh-türetilmiş kabuklar $(...)sözdizimini desteklemeyebilir . Eşdeğer backtick sözdizimini kullanabilirsiniz:

$ rm -f `ls | grep -i '^abc\.log\.'`

$(...)Sözdizimi daha kolay okunmasını ve gerçekten iddialı iseniz o iç içe olabilir.

Son olarak, silmek istediğiniz dosyaların alt kümesi normal bir ifadeyle kolayca ifade edilemiyorsa, sıklıkla kullandığım bir numara, dosyaları geçici bir metin dosyasına listelemek ve ardından düzenlemektir:

$ ls > list
$ vi list   # Use your favorite text editor

Daha sonra listdosyayı manuel olarak düzenleyebilir, yalnızca kaldırmak istediğim dosyaları bırakabilirim ve ardından:

$ rm -f $(<list)

veya

$ rm -f `cat list`

(Yine, bu, dosya adlarından hiçbirinin komik karakterler, özellikle boşluklar içermediğini varsayar.)

Veya listdosyayı düzenlerken, rm -f her satırın başına ekleyebilirim ve ardından:

$ . ./list

veya

$ source ./list

Dosyasını düzenleme de gerekli değişen örneğin, tırnak eklemek için bir fırsattır rm -f foo bariçin rm -f 'foo bar'.


8

Tüm dosyaları tek bir satırda birleştirmek ve her dosya adı arasına bir boşluk eklemek ve ardından rmlistenin başına eklemek için çok satırlı seçimi kullanın . Bu, çoğunlukla silmek istediğiniz dosya adlarında bir kalıp olmadığında kullanışlıdır.

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

Bu, sorulan soruyu açıkça cevapladığı için kabul edilen cevap olmalıdır. Buraya Google'dan gelenler için daha arkadaş canlısı.
ATLief

5

Bir joker kart bunun için işe yarar, ancak güvenli olması için en iyisi joker kart kullanımını olabildiğince az yapmaktır, yani şunun gibi bir şey:

rm -rf abc.log.2012-*

Görünüşe göre bunlar sadece tek dosyalar mı? Özyinelemeli seçenek, bu öğelerin hiçbiri dizin değilse gerekli olmamalıdır, bu yüzden en iyisi onu kullanmamak, sadece güvenlik için.


2

Ben bir linux gurusu değilim, ancak çıktı dosyaları listenizi yönlendirmek istediğinize inanıyorum xargs rm -rf. Geçmişte böyle bir şeyi iyi sonuçlarla kullandım. Önce örnek bir dizinde test edin!

DÜZENLEME - Görünen diğer yanıtlara dayanarak yanlış anlamış olabilirim. Joker karakterler kullanabiliyorsanız, harika. Görüntülediğiniz orijinal listenizin, size "seçiminizi" verecek bir program tarafından oluşturulduğunu varsaydım, bu yüzden boru tesisatının xargsgitmenin yolu olacağını düşündüm .


-1

bir dizine ait olan tüm dosyaları aynı anda silmek istiyorsanız. Örneğin: Dizininizin adı "log" ve "log" dizini abc.log.2012-03-14, abc.log.2012-03-15, ... etc dosyalarını içerir. Günlük dizininin üstünde olmanız ve:

rm -rf /log/*
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.