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


11

명령을 사용하여 디렉토리에 3 개의 파일을 작성했습니다 touch inv{1..3}.txt. 이제 두 가지 명령을 사용했으며 출력은 거의 동일합니다. 이 두 명령은 ls inv[13].txtls {1,3}.txt입니다.

이 두 가지는 어떻게 다른가요? 대괄호와 중괄호는 어떻게 다릅니 까? 또한 "linux [..]"에 대해 인터넷 검색을했지만 아무것도 찾을 수 없었으므로 Linux 용어에서 이러한 기능이 무엇인지 알 수 있습니까?

감사


2
이것의 이름은 "filename expansion"또는 "globbing"입니다.
바이트 사령관

다음 중 파일 이름 확장 또는 글 로빙 중 어느 것입니까? 대괄호 ([..]) 또는 꽃 브래킷 ({..})입니까?
posixKing

방문 중괄호 확장 을위한 {}파일 이름 확장> 패턴 매칭 을위한 [].
Pandya

답변:


14
  • {}괄호 확장이라고합니다. : 그것은 두 가지 형태를 가지고 {x..y}{x,y}교체, x그리고 y어떤 알파벳이나 숫자 값.

    첫 번째 양식에서 {x..y}모든 값으로 확장됩니다 xy포함. 예를 들어, {2..5}확장 될 것이다 2, 3, 4, 5.

    두 번째 명시 적 형태로, {x,y}단지로 확장됩니다 x, y. 예를 들어 및 {2,5}로 확장됩니다 .25

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

    중요한 점은 파일 작성 / 매칭 중에 파일 일치에 관계없이 중괄호 확장이 (가능한 경우) 수행된다는 것입니다.

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

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

    첫 번째 형식에서는 대괄호 안에있는 단일 문자를 개별적으로 일치시킵니다. 즉, 각 문자는 개별적으로 처리됩니다. 따라서 [25].txt이름이 2.txt또는 5.txt현재 디렉토리에 [245].txt있는 파일과 일치하고 이름이 2.txt또는 4.txt또는 인 파일과 일치합니다 5.txt.

    제 2 형태에서, 가능하다면 문자 그대로 처리되는 경우, 개별적으로 매칭하기 전에 범위 확장이 먼저 수행된다. 따라서 [2-5]. txt, 2.txt또는 3.txtor 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에 의해 정의된다.

가새 확장 {}은 POSIX에 의해 정의되지 않으므로 모든 쉘에서 이식 가능하지 않습니다. 예를 들어 dash( shUbuntu)에는 이것이 없습니다. 그것은에서 차용 된 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

1
[ ]셸 구성에 따라 다를 수 있으므로 일치 항목이 없을 때 확장 동작에 의존하지 않아야 합니다. [또는 ]파일 이름 을 사용하려면 명령에 따옴표로 묶어야합니다. 또한 사이의 차이를 알아 차리지 가치 {13..79}[13-79]. 의 범위에있는 모든 숫자를 생성합니다 첫 번째 1379, 두 번째는 한 문자와 일치하는 것 1, 3, 4, 5, 6, 7,와 9.
kasperd

@kasperd 그렇습니다 nullglob. [정보 [13-79]매칭, 나는`[]의 문자 당 행동에 대한 내 대답에 명확하게 언급 생각합니다.
heemayl

@heemayl`{1..3}`형식이 bashism이라는 것도 언급 할 가치가 있다고 생각합니다. 이것은 대시에서 작동하지 않습니다. 내 생각 ksh에이 기능이 있지만 그것은 mksh 및 pkdsh처럼, 더 현대적인 맛을의
세르지 Kolodyazhnyy

@Serg 이식성 메모를 추가했습니다.
heemayl

7

두 양식의 주요 차이점은 다음과 같습니다.

$ 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.txtinv5.txt관계없이 파일이 파일 시스템에 실제로 무엇인지. 이것은 중괄호 확장 입니다.


다른 주요 차이점은 쓸 수 ba{con,tman}있고 대괄호를 사용하는 것과 동등한 것이 없다는 것 입니다. IOW, 중괄호 확장은 단일 문자만을위한 것이 아닙니다.
hobbs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.