Ortak önek ve sonek içeren birden fazla dosyayı nasıl kaldırırım?


21

Adında birçok dosya var

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

ve adlandırılmış dosyalar

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

ve adlandırılmış dosyalar

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

ve

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

Sadece 'array_1' ile başlayan ve '.hmf' ile biten dosyaları kaldırmak istiyorum, ancak binlerce dosya olduğundan bunları tek tek kaldırmak istemiyorum. 'Dizilimi_1' ile başlayan ve '.hmf' ile biten her şeyi kaldırmak istediğim rm komutunu nasıl belirtebilirim?

Şu anda RedHat Linux sistemiyle çalışıyorum, ancak diğer dağıtımlarda da nasıl yapıldığını bilmek istiyorum.

Yanıtlar:


28
rm sequence_1*.hmf

ile başlayan sequence_1ve biten dosyaları siler .hmf.


Kabarma, kabuğunuzun bir desen aldığı ve onu bu desenle eşleşen bir dosya listesi listesine genişleten bir süreçtir. Farklı ifadelerle normal ifadelerle karıştırmayın. Zamanınızın çoğunu bashburada geçirirseniz, Wooledge Wiki'nin dünyayı dolaşması hakkında güzel bir sayfası vardır (yol adı genişletme) . Maksimum taşınabilirlik istiyorsanız , desen eşleşmesinde / yerine POSIX özelliğini okumak isteyeceksiniz .


Muhtemel bir durumda "Çok uzun bir argüman listesi" hatasıyla karşılaşırsanız, bunu ele alan BashFAQ 95'e bir göz atabilirsiniz . En basit geçici çözüm, hata ortadan kalkıncaya kadar glob desenini birden fazla küçük parçaya bölmektir. Sizin durumunuzda, eşleşmeyi aşağıdaki gibi 0 ile 9 arasındaki ön basamak basamaklarına göre bölmekten kurtulabilirsiniz:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

Bu, 'çok uzun tartışma listesi' hatası etrafında yapılan çok akıllıca bir çalışma. Benim durumumda yirmi bin dosyam var, sanırım 0'dan .., 20'ye kadar for döngüsü kullanmak zorunda kalacağım. Sağ?
Paul,

@Paul Doğru, listeyi istediğiniz kadar parçaya ayırın, ancak bir noktada findyaklaşım tahmin edip kontrol etmekten daha kolay hale gelir.
jw013

14

Her ne kadar jw013'ün cevabı tam dünya küresi olsa da, binlerce kibritiniz varsa bu komut başarısız olabilir: rm sequence_1_0001.hmf sequence_1_0002.hmf ...Kabuk tarafından üretilen genişletilmiş komut satırı çok büyük olabilir.

Dom'un önerdiği gibi, -deleteseçeneği ile de kullanabilirsiniz find:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

Hem -maxdepthve -deletedeğil ise POSIX standardı oldukça yaygındır findvahşi uygulamaları. Linux dağıtımları genellikle findkesinlikle bu seçenekleri destekleyen GNU'yu kullanır .


2
Yapabiliyorsanız, bulmak için -delete seçeneğini kullanın, her dosya için çatal kullanmaz ...
Dom

Eklendi, şerefe. -deleteYeni GNU ve BSD sistemlerinde desteklenmeli gibi görünüyor , -print0sadece GNU. Bu yüzden muhtemelen daha da taşınabilir (OP için bir fark yaratmamasına rağmen).
İşe yaramaz

En azından OS X’lerin -print0'ı var, ancak POSIX’e dahil edilmedi.
Lri

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

Bash de çalışırdı.


Ayraç genişletme gerektirir bashve sıfır dolgulu formun sürüm 4'e ihtiyacı var sanırım.
jw013
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.