Standardowym wzorcem globowania nazw plików pasującym do cyfry jest [0-9]
. To pasuje do jednej cyfry:
cat file[0-9].txt
Aby wybrać tylko dwa z nich:
cat file[25].txt
W przypadku liczb większych niż 9 przydatne będzie rozwinięcie nawiasu klamrowego (ale patrz uwaga poniżej na temat różnicy między wzorcami globowania a rozszerzeniami nawiasów):
cat file{25..60}.txt
Ponownie rozwinięcie nawiasu pozwala również na indywidualne liczby:
cat file{12,45,900,xyz}.txt
(zauważ, że w powyższym przykładzie interpretacja nawiasów nie obejmuje pętli arytmetycznej, a jedynie generuje nazwy na podstawie podanych ciągów).
W bash
, z extglob
włączoną opcją powłoki ( shopt -s extglob
), będą również działać:
cat file@(12|45|490|foo).txt
@(...)
Wzór będzie pasował do dowolnego jednego z dołączonych |
-delimited wzorów.
Różnica między wzorcami globowania jako [...]
i @(...)
rozszerzeniami nawiasów polega na tym, że rozwinięcie nawiasów jest generowane w wierszu poleceń i może nie pasować do żadnych istniejących nazw w bieżącym katalogu. Wzorzec globowania nazw plików będzie pasował do nazw, ale powłoka nie będzie narzekać, jeśli nie wszystkie możliwe nazwy będą istnieć. Jeśli nie istnieje pasująca nazwa, wzorzec pozostanie nierozwinięty, chyba że zostanie również ustawiona nullglob
opcja powłoki, w którym to przypadku wzór zostanie usunięty.
Przykład:
touch file1
ls file[0-9]
Tutaj wyświetlana będzie tylko lista plików dla file1
.
Dzięki ls file{0..9}
, ls
że narzekają nie znalezienia file0
, file2
etc.
W poniższym przykładzie pierwsze polecenie dotknie tylko istniejących nazw, które pasują do danego wzorca, podczas gdy drugi wiersz utworzy pliki, które jeszcze nie istnieją:
touch file[0-9]
touch file{0..9}
file45.txt
. Wyrażenie w nawiasach[...]
działa tak samo jak w wyrażeniach regularnych, ale używa!
zamiast wyrażenia^
„nie w”.[...]
Wzór zawsze będzie pasował do pojedynczego znaku.{1,2}
nie jest zgodny z POSIX ... nauczyłem się dziś kilku nowych rzeczy!grep
, generowania adresów URL do przesłaniacurl
itp., Ale może to również być mylące dla ludzi przyzwyczajonych do pracy z globami.Składnia, której należy użyć,
file{1,2}
będzie oceniać dofile1
ifile2
.Jak wskazał również Inian ... łatwiej byłoby to zrobić
touch file{1..9}
w tym przykładzie ...Możesz także użyć wielu wyrażeń, takich jak:
Tak, powyższe spowoduje utworzenie 234 (
9
razy26
) plików.źródło
file{1,2}
składnia jest również wygodna do zmiany nazw plików:mv some_very_long_filename.txt{,.bak}
Tak, możesz użyć rozszerzenia nawiasu klamrowego w
bash
powłoce. Tylko kilka plików po prostu zróbfile{1..2}
lub tak samofile{1,2}
Lub jeśli martwisz się, że w niektórych przypadkach nie ma tam plików, po prostu wykonaj prostą pętlę,
Lub jeśli tylko łączenie jest twoją jedyną operacją na plikach i jeśli nie masz pewności, które pliki nie mogą być obecne w dowolnym momencie, po prostu
cat
je i pomiń błędy. Przekierowanie standardowego błędu w celu/dev/null
wyeliminowania błędów, jeśli plik nie jest dostępny.lub użyj wyrażenia glob,
file[15]
które nie skarży się na błędy, jeśli plik nie został znaleziony.źródło
file{1,5}
brakowało mi składni przecinków!