ls [13]과 ls {1,3}의 차이점은 무엇입니까?

ls [13]과 ls {1,3}의 차이점은 무엇입니까?

명령을 사용하여 내 디렉터리에 세 개의 파일을 만들었습니다 touch inv{1..3}.txt. 이제 두 개의 명령을 사용했는데 출력은 거의 동일합니다. 그 두 명령은 ls inv[13].txt및 입니다 ls {1,3}.txt.

그러면 이 둘은 어떻게 다른가요? 대괄호는 중괄호와 어떻게 다른가요? 또한 "linux [..]"에 대해 인터넷 검색을 했으나 아무것도 찾을 수 없었습니다. 그렇다면 이러한 것들을 Linux 용어로 무엇이라고 부르는지 알 수 있습니까?

감사해요

답변1

  • {}버팀대 확장이라고 합니다. 두 가지 형식이 있습니다. {x..y}{x,y}, x및 를 y임의의 알파벳 또는 숫자 값으로 바꿉니다.

    첫 번째 형식에서는 에서 까지 {x..y}의 모든 값으로 확장됩니다 . 예를 들어 , , , 로 확장됩니다 .xy{2..5}2345

    두 번째 명시적 형식에서는 , 로만 {x,y}확장됩니다 x. y예를 들어, 및 {2,5}으로 확장됩니다 .25

    확장이 불가능할 경우 패턴은 문자 그대로 처리됩니다(예: ) {a..3}.

    주목해야 할 중요한 점은 파일 생성/일치 중에 파일 일치와 관계없이 중괄호 확장이 (가능한 경우) 수행된다는 것입니다.

  • []경로 이름 확장(또는 글로빙) 패턴이라고 합니다. 중괄호 확장과 달리 파일 이름을 일치시키는 동안에만 사용할 수 있으며, 파일을 생성하는 동안 사용하면 문자 그대로 처리됩니다.

    [xyz...]와 의 두 가지 형식이 있습니다 [x-y].

    첫 번째 형식에서는 대괄호 안의 단일 문자와 별도로 일치합니다. 즉, 각 문자는 개별적으로 처리됩니다. 따라서 for 는 현재 디렉터리에 있는 or [25].txt라는 파일과 일치하고 , for는 or 또는이라는 이름의 모든 파일과 일치합니다 .2.txt5.txt[245].txt2.txt4.txt5.txt

    두 번째 형식에서는 개별적으로 일치하기 전에 먼저 범위 확장이 수행됩니다. 가능하면 문자 그대로 처리됩니다. 따라서 의 경우 or 또는 or [2-5]. txt라는 이름의 모든 파일과 일치합니다 . 범위를 확장할 수 없는 경우 문자 그대로 처리됩니다 . 예를 들어 .2.txt3.txt4.txt5.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( shUbuntu에서는)에는 이것이 없습니다. 이것은 , , , 에서 차용되었으며 csh특정 쉘에서만 작동합니다 . 구현하기 전에 사용 중인 셸이 이를 지원하는지 확인하세요.bashzshksh93fish


예:

$ 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].txtglob이며 파일 시스템에서 일치하는 파일 목록을 확장합니다. 이것은경로명 확장.

inv{1,5}.txt실제로 파일 시스템에 어떤 파일이 있는지에 관계없이 확장됩니다 inv1.txt. inv5.txt이것은버팀대 확장.

관련 정보