Jaka jest różnica między ls [13] a ls {1,3}?

11

Utworzyłem trzy pliki w moim katalogu za pomocą polecenia touch inv{1..3}.txt. Teraz użyłem dwóch poleceń, a ich wynik jest prawie taki sam. Te dwa polecenia to ls inv[13].txti ls {1,3}.txt.

Więc czym się różnią te dwa? Czym różnią się nawiasy kwadratowe od nawiasów klamrowych? Również googlowałem dla „linux [..]”, ale nic nie znalazłem, więc czy mogę wiedzieć, jak te rzeczy są nazywane w terminologii linux?

Dzięki

posixKing
źródło
2
Nazwą tego jest „rozszerzenie nazwy pliku” lub „globbing”.
Bajt Dowódca
Który z nich to rozszerzenie lub globowanie nazw plików? Czy to nawias kwadratowy ([..]) czy nawias kwiatowy ({..})?
posixKing
Wejdź na Brace Expansion for {}i File Name Expansion> Pattern Matching dla [].
Pandya,

Odpowiedzi:

14
  • {}nazywa się rozszerzaniem nawiasów klamrowych. Ma dwie formy: {x..y}a {x,y}, wymienić xi yprzy dowolnej wartości alfabetycznym lub numerycznym.

    W pierwszej formie {x..y}zostanie rozwinięty do wszystkich wartości od xdo ywłącznie. Na przykład, {2..5}zostanie rozszerzona 2, 3, 4, 5.

    W drugim zrozumiałej formie, {x,y}zostanie rozszerzona wyłącznie x, y. Na przykład {2,5}zostanie rozwinięty do 2i 5.

    Jeśli nie jest możliwe rozwinięcie, wzór jest traktowany dosłownie np {a..3}. W.

    Ważną rzeczą do zapamiętania jest to, że rozwinięcie nawiasów zostanie wykonane (jeśli to możliwe) niezależnie od dopasowania pliku, podczas tworzenia / dopasowania pliku.

  • []jest znany jako wzorzec rozwinięcia (lub globowania) ścieżki. W przeciwieństwie do rozszerzenia nawiasów klamrowych możesz go używać tylko podczas dopasowywania nazw plików, będzie traktowany dosłownie, jeśli użyjesz go podczas tworzenia plików.

    Ma dwie formy: [xyz...]i [x-y].

    W pierwszej formie będzie pasował do każdego pojedynczego znaku w nawiasach kwadratowych oddzielnie, tzn. Każdy znak jest traktowany indywidualnie. Tak więc [25].txtbędzie pasował do pliku o nazwie 2.txtlub 5.txtw bieżącym katalogu, podczas [245].txtgdy będzie pasował do dowolnego pliku o nazwie 2.txtlub 4.txtlub 5.txt.

    W drugiej formie, rozszerzenie zakresu jest wykonywane najpierw przed dopasowaniem indywidualnie, jeśli to możliwe, traktowane dosłownie. Tak więc [2-5]. txt, dopasuje każdy plik o nazwie 2.txtlub 3.txtlub 4.txtlub 5.txt. Jeśli zakresu nie można rozszerzyć, będzie traktowany dosłownie np. W przypadku [a-3].txt.


Ważną różnicą behawioralną między tymi dwoma jest to, że istnieje więcej pasujących wzorów, a mniej faktycznie jest dopasowywanych. Ponieważ interpretacja nawiasów jest wykonywana bez względu na wszystko, pokaże błąd, że niektóre pliki nie istnieją, podczas gdy rozwinięcie nazwy ścieżki będzie pasować, bez względu na możliwy błąd, dla pozostałych:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

Uwaga dotycząca przenoszenia:

[]Operatora rozszerzenie ścieżka jest wyznaczona przez POSIX stąd między przenośnym Bourne powłoki i pochodne.

Rozszerzenie nawiasów, {}nie jest zdefiniowane przez POSIX, dlatego nie jest przenośne wśród wszystkich powłok. Na przykład dash( shw Ubuntu) tego nie ma. Został wypożyczony z cshi będzie działać tylko na niektórych muszli np bash, zsh, ksh93, fish. Upewnij się, że używana powłoka obsługuje to przed wdrożeniem.


Przykład:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory
heemayl
źródło
1
Należy unikać polegania na zachowaniu [ ]ekspansji, gdy nie ma żadnych dopasowań, ponieważ mogą się one różnić w zależności od konfiguracji powłoki. Jeśli chcesz użyć [lub ]w nazwie pliku, należy go podać w poleceniach. Warto również zauważyć różnicę między {13..79}i [13-79]. Pierwszy będzie produkować wszystkie liczby w zakresie od 13do 79, drugi będzie pasował znaki 1, 3, 4, 5, 6, 7, i 9.
kasperd
@kasperd Tak, właśnie po to nullglob(lub podobnie). Jeśli chodzi o [13-79]dopasowanie, myślę, że wyraźnie wspomniałem w mojej odpowiedzi na temat zachowania poszczególnych postaci [] `.
heemayl
@ heemayl Myślę, że warto również wspomnieć, że forma `{1..3}` to bashism. To nie zadziała w desce rozdzielczej. Myślę, że kshma tę funkcję, ale nie jest to bardziej nowoczesne smaki, takie jak mksh i pkdsh
Sergiy Kolodyazhnyy
@Serg Dodano notatkę dotyczącą przenoszenia.
heemayl
7

Kluczową różnicę między tymi dwiema formami zilustrowano tutaj:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txtjest globem i rozszerzy listę pasujących plików w systemie plików. To jest rozszerzenie nazwy ścieżki .

inv{1,5}.txtrozwija się inv1.txti inv5.txtniezależnie od tego, jakie pliki faktycznie znajdują się w twoim systemie plików. To jest nawias klamrowy .

John1024
źródło
Inną kluczową różnicą jest to, że możesz pisać ba{con,tman}i nie ma odpowiednika za pomocą nawiasów kwadratowych. IOW, rozwijanie nawiasów klamrowych nie dotyczy tylko pojedynczych znaków.
hobbs