Mam zestaw plików w katalogu ponumerowanym w następujący sposób:
file1.txt
file2.txt
...
file30.txt
...
Teraz chciałbym uruchomić polecenie dla określonego zakresu plików, powiedzmy od 18 do 31.
Do tej pory korzystałem z następujących sposobów,
trzy argumenty
command file1[8-9].txt file2[0-9].txt file3[0-1].txt
Załóżmy teraz, że chcę co drugi numer,
pętla
for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command
wydaje się, że jest to bardziej niezawodna pętla (spacje działają)
for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command
ale wydaje się, że powinien istnieć prostszy sposób na zrobienie tego. Domyślam się, że najlepszym rozwiązaniem jest utworzenie funkcji bash, która zwróci zestaw plików do wiersza poleceń. Wtedy mógłbym zrobić coś takiego,
command `filerange file 18 31`
Czy istnieją lepsze sposoby lub sugestie dotyczące robienia tego skutecznie?
Z góry przepraszam, jeśli przegapiłem to samo pytanie, na które odpowiedziano gdzie indziej w Internecie lub w Internecie superuser
.
for
pętli, która pozwala na spacje w nazwach plików za pomocą xargs. Wydaje się, że działa, jeśli nie masz bash 4. Jeśli masz bash 4, zdecydowanie użyj rozszerzenia nawiasów klamrowych! Zobacz wybraną odpowiedź. Bezwstydna wtyczka do aktualizacji Snow Leopard bashOdpowiedzi:
Spróbuj tego:
Jest znany jako „wyrażenie sekwencji” i jest częścią funkcji rozszerzenia nawiasu klamrowego Basha . Działa w Bash 3 i 4.
Funkcja przyrostu jest nowością w Bash 4. Prawdopodobnie masz Bash 3.x.
W Bash 4 możesz:
Ale w Bash 3 musisz to zrobić, aby uzyskać te same wyniki:
Ta sama forma z przyrostem o jeden:
Każda z liczb może być zmienną lub wyrażeniem. Jednak w wyrażeniu sekwencyjnym liczby muszą być stałymi
Oto przykład użycia tego formularza w twoich plikach:
Kolejną nową funkcją wyrażeń sekwencji w Bash 4 jest możliwość dołączania zer wiodących. Jest to przydatne, jeśli chcesz utworzyć (i użyć) pliki o numerach, które można odpowiednio posortować.
W Bash 4:
tworzyłby pliki o nazwach „file001.txt” do „file010.txt”. Ich nazwy będą sortowane w oczekiwanej kolejności. Bez wiodących zer „file10.txt” posortowałby przed „file1.txt”.
Aby pracować z plikami, możesz użyć tej samej wiodącej składni zerowej:
W Bash 3, jeśli potrzebujesz zer wiodących, musisz samodzielnie wpisać wartość:
printf
Informacja będzie dołączana wartość i z zerem na początku a więc szerokość 3, na przykład ( „4” staje się „004”).Edytować:
Dostosowanie spacji w nazwach plików jest proste:
źródło
{1..10..2}
do pracy w bash OSX.{01..10}
są nowe w Bash 4. Prawdopodobnie masz Bash 3.x. Jeśli potrzebujesz funkcji zwiększania lub aby użyć zmiennych dla granic zakresu, skorzystaj z tego formularza:for ((i=1; i<=10; i+=2}
(lubi++
do zwiększenia o jeden). Każda z liczb może być zmienną lub wyrażeniem. Następnie, aby użyć wartości wewnątrzfor
pętli:echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do:
printf -vi '% 03d' $ i`, która poprzedzi wartośći
z zerami wiodącymi, więc szerokość wynosi na przykład 3 (na przykład „4” staje się „004”).