![ls [13]과 ls {1,3}의 차이점은 무엇입니까?](https://rvso.com/image/885982/ls%20%5B13%5D%EA%B3%BC%20ls%20%7B1%2C3%7D%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
명령을 사용하여 내 디렉터리에 세 개의 파일을 만들었습니다 touch inv{1..3}.txt
. 이제 두 개의 명령을 사용했는데 출력은 거의 동일합니다. 그 두 명령은 ls inv[13].txt
및 입니다 ls {1,3}.txt
.
그러면 이 둘은 어떻게 다른가요? 대괄호는 중괄호와 어떻게 다른가요? 또한 "linux [..]"에 대해 인터넷 검색을 했으나 아무것도 찾을 수 없었습니다. 그렇다면 이러한 것들을 Linux 용어로 무엇이라고 부르는지 알 수 있습니까?
감사해요
답변1
{}
버팀대 확장이라고 합니다. 두 가지 형식이 있습니다.{x..y}
및{x,y}
,x
및 를y
임의의 알파벳 또는 숫자 값으로 바꿉니다.첫 번째 형식에서는 에서 까지
{x..y}
의 모든 값으로 확장됩니다 . 예를 들어 , , , 로 확장됩니다 .x
y
{2..5}
2
3
4
5
두 번째 명시적 형식에서는 , 로만
{x,y}
확장됩니다x
.y
예를 들어, 및{2,5}
으로 확장됩니다 .2
5
확장이 불가능할 경우 패턴은 문자 그대로 처리됩니다(예: )
{a..3}
.주목해야 할 중요한 점은 파일 생성/일치 중에 파일 일치와 관계없이 중괄호 확장이 (가능한 경우) 수행된다는 것입니다.
[]
경로 이름 확장(또는 글로빙) 패턴이라고 합니다. 중괄호 확장과 달리 파일 이름을 일치시키는 동안에만 사용할 수 있으며, 파일을 생성하는 동안 사용하면 문자 그대로 처리됩니다.[xyz...]
와 의 두 가지 형식이 있습니다[x-y]
.첫 번째 형식에서는 대괄호 안의 단일 문자와 별도로 일치합니다. 즉, 각 문자는 개별적으로 처리됩니다. 따라서 for 는 현재 디렉터리에 있는 or
[25].txt
라는 파일과 일치하고 , for는 or 또는이라는 이름의 모든 파일과 일치합니다 .2.txt
5.txt
[245].txt
2.txt
4.txt
5.txt
두 번째 형식에서는 개별적으로 일치하기 전에 먼저 범위 확장이 수행됩니다. 가능하면 문자 그대로 처리됩니다. 따라서 의 경우 or 또는 or
[2-5]. txt
라는 이름의 모든 파일과 일치합니다 . 범위를 확장할 수 없는 경우 문자 그대로 처리됩니다 . 예를 들어 .2.txt
3.txt
4.txt
5.txt
[a-3].txt
이 둘 사이의 중요한 동작 차이는 일치시킬 패턴이 더 많지만 실제로 일치하는 패턴은 더 적다는 것입니다. 중괄호 확장은 무슨 일이 있어도 수행되므로 특정 파일이 존재하지 않는다는 오류가 표시되는 반면 경로 이름 확장은 나머지에 대한 오류 없이 가능한 모든 것과 일치합니다.
$ 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
이식성 참고:
경로 []
이름 확장 연산자는 POSIX에 의해 정의되므로 Bourne 쉘과 파생 제품 간에 이식 가능합니다.
중괄호 확장은 {}
POSIX에 의해 정의되지 않으므로 모든 쉘 간에 이식 가능하지 않습니다. 예를 들어 dash
( sh
Ubuntu에서는)에는 이것이 없습니다. 이것은 , , , 에서 차용되었으며 csh
특정 쉘에서만 작동합니다 . 구현하기 전에 사용 중인 셸이 이를 지원하는지 확인하세요.bash
zsh
ksh93
fish
예:
$ 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
답변2
두 형식의 주요 차이점은 다음과 같습니다.
$ 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].txt
glob이며 파일 시스템에서 일치하는 파일 목록을 확장합니다. 이것은경로명 확장.
inv{1,5}.txt
실제로 파일 시스템에 어떤 파일이 있는지에 관계없이 확장됩니다 inv1.txt
. inv5.txt
이것은버팀대 확장.