UNIX joker karakterleriyle dosya aralığını listeleyin


14

Örneğin, çalışma dizinimde şu dosyaları buldum: mjk0001.fits, mjk0002.fits, ... sayısal olarak mjk9999.fits'e kadar artırılıyor.

Sıralı bir grubu listelemek veya üzerinde çalışmak için UNIX joker karakterlerini kullanmanın bir yolu var mı? Örneğin, 0025 - 0050 arasında bir işlem yürütmem gerekirse, hangi biçimi kullanmalıyım?

Aşağıdakileri denedim ama başarılı olamadım:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Herkese şimdiden teşekkürler MK


Referans için: desen eşleme , globbing
ignis 26:13

Yanıtlar:


20

Küme ayracı genişletmeyi kullanabilirsiniz:

ls mjk00{25..50}.fits

Gerekirse önde gelen sıfırlar dahil edilebilir:

ls mjk0{000..149}.fits

1
Bu sözdizimini kullanarak, aynı zamanda bir adım değeri belirtebilirsiniz: {25..50..2}.
nobar

1

Doğrudan değil, ancak birden fazla glob deseni kullanabilirsiniz:

ls mjk002[56789].fits mjk00[34]?.fits

Tam olarak aradığın şey değil, ama glob kalıplarının sunduğu en yakın şey ve her bir fileystem yazmaktan kesinlikle daha iyi. En azından sayısal aralık başına ihtiyacınız olacak desen sayısı, aralığın sayısal uç noktalarının günlüğü ile sınırlıdır.


1

Grep ile normal ifadeyi kullanabilirsiniz. Ben normal ifade gurusu değilim. Aşağıdakiler, 25-50 arasındaki sayılara sahip deseni döndürür:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

Bunun mümkün olup olmadığını ve nihayetinde bunu grep ile nasıl genelleştirdiğini bilmiyorum.


0

Bir fordöngü kullanarak daha fazla taşınabilirlik veya esneklik elde etmek mümkün olabilir ve printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Bu, boşlukları iyi işler ve sonuçlar, xargsdaha sonraki işlemler için boru tesisatı için çok uygundur .

Birden fazla eşleşmeye sahip sayılar, eşleşen tüm dosyaların listelenmesine neden olur.

Eşleşmesi olmayan sayılar stderr'de bir hata bildirir, ancak ||truebash düzeyinde bir hata döndürmesini bastırır.


Temel durumda, forve kullanmak printfdaha özlü olmaktan farklı değildir:

ls --escape mjk{0025..0050..1}* ||true

Brace genişletmesinin sonuçlarını ayırmak istiyorsanız, for döngüsü kullanabilirsiniz:for i in {025..050} ; do ... ; done
nobar
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.