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


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

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.


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.


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

Jeśli chcesz oddzielić wyniki rozwinięcia nawiasu, możesz użyć pętli for:for i in {025..050} ; do ... ; done
nobar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.