Lista zakresu plików za pomocą symboli wieloznacznych UNIX

14

Powiedzmy na przykład, że mam następujące pliki w moim katalogu roboczym: mjk0001.fits, mjk0002.fits, ... zwiększając liczbowo aż do mjk9999.fits.

Czy istnieje sposób użycia symboli wieloznacznych UNIX do wyświetlenia listy lub działania na sekwencyjnej ich grupie? Na przykład, jeśli muszę uruchomić proces od 0025 do 0050, jakiego formatu miałbym użyć?

Próbowałem następujących, ale nie odniosłem sukcesu:

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

Z góry dziękuję wszystkim, MK

Matt Keene
źródło
Dla porównania: dopasowanie wzoru , globowanie
ignis

Odpowiedzi:

20

Możesz użyć rozszerzenia nawiasu klamrowego:

ls mjk00{25..50}.fits

W razie potrzeby można wstawić zera wiodące:

ls mjk0{000..149}.fits
chepner
źródło
1
Używając tej składni, można również określić wartość kroku: {25..50..2}.
nobar
1

Nie bezpośrednio, ale możesz użyć wielu wzorów globów:

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

Nie jest to dokładnie to, czego szukasz, ale jest to najbliższa rzecz, jaką oferują wzorce globów, i na pewno jest lepsza niż pisanie każdego systemu plików. Przynajmniej liczba wzorów potrzebnych w danym zakresie liczbowym jest ograniczona dziennikiem numerycznych punktów końcowych zakresu.

Celada
źródło
1

Możesz użyć wyrażenia regularnego z grep. Nie jestem guru wyrażeń regularnych. Poniższy zwraca wzór z liczbami między 25-50:

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

Nie wiem, czy to możliwe i jak ostatecznie uogólnić to za pomocą grep.

Heisenbug
źródło
0

Większa przenośność lub elastyczność może być możliwa dzięki zastosowaniu forpętli i printf:

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

To dobrze radzi sobie z odstępami, a wyniki są odpowiednie do orurowania i xargsdalszego przetwarzania.

Liczby z wieloma dopasowaniami spowodują wyświetlenie wszystkich pasujących plików na liście.

Liczby bez dopasowania zgłaszają błąd na stderr, ale ||truepomija powrót błędu na poziomie bash.


Jednak w podstawowym przypadku użycie fori printfnie różni się od bardziej zwięzłego:

ls --escape mjk{0025..0050..1}* ||true
nobar
źródło
Jeśli chcesz oddzielić wyniki rozwinięcia nawiasu, możesz użyć pętli for:for i in {025..050} ; do ... ; done
nobar