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
bash
unix
command-line
ls
Matt Keene
źródło
źródło
Odpowiedzi:
Możesz użyć rozszerzenia nawiasu klamrowego:
W razie potrzeby można wstawić zera wiodące:
źródło
{25..50..2}
.Nie bezpośrednio, ale możesz użyć wielu wzorów globów:
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.
źródło
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:
Nie wiem, czy to możliwe i jak ostatecznie uogólnić to za pomocą grep.
źródło
Większa przenośność lub elastyczność może być możliwa dzięki zastosowaniu
for
pętli iprintf
:To dobrze radzi sobie z odstępami, a wyniki są odpowiednie do orurowania i
xargs
dalszego 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
||true
pomija powrót błędu na poziomie bash.Jednak w podstawowym przypadku użycie
for
iprintf
nie różni się od bardziej zwięzłego:źródło
for i in {025..050} ; do ... ; done