괄호 확장은 언제 사용합니까?


49

중괄호 확장 이 무엇인지 이해 하지만 어떻게 사용하는 것이 가장 좋은지 모르겠습니다.

언제 사용합니까?
팁이 있다면 편리하고 놀라운 예를 가르쳐주세요.

답변:


52

긴 경로 이름이있는 경우 브레이스 확장은 매우 유용합니다. 파일백업하는 빠른 방법으로 사용합니다 .

cp /a/really/long/path/to/some/file.txt{,.bak}

에 복사 /a/really/long/path/to/some/file.txt합니다/a/really/long/path/to/some/file.txt.bak

순서대로 사용할 수도 있습니다 . 한때 웹에서 많은 페이지를 다운로드하기 위해 그렇게했습니다.

wget http://domain.com/book/page{1..5}.html

또는

for i in {1..100}
do
   #do something 100 times
done

8
이것은 인수 복제에도 사용될 수 있습니다. 모든 파일이 작동하기 위해 '-f'인수가 필요한 프로그램이 있다고 가정 해보십시오. 대신에 program -f file1 -f file2 -f file3할 수있는 일program "-f file"{1..3}
Patrick

부끄러운 일입니다. 방금 그것을 발견했지만 rhis를 모른 채 몇 년 동안 여분의 긴 길에서 백업 작업을 수행합니다. 감사.
smonff

2
@Patrick : program세 단어를 얻기 때문에 실패합니다 : "-f file1" "-f file2" "-f file3", 6 : 대신 "-f" "file1" "-f" "file2" "-f" "file3".
musiphil

@dogbane : for루프 에서 사용하기 위해 확장을 사용하는 것은 쓸모가 없으며 for ((i=1; i<=100; i++))보다 효율적 이므로 약간 의미가 없습니다.
musiphil

30

큰 디렉토리 구조를 만들 때 중괄호 확장은 매우 편리합니다.

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

이것은 당신에게 줄 것이다

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

한 단계 더 나아가 괄호 확장을 괄호 확장에 넣을 수도 있습니다.

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

이것은 위의 예와 동일한 디렉토리 구조를 제공합니다.


3
중첩은 좋지만 중첩 예제 ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}})는 실제로 어떤 목적으로도 사용되지 않습니다. 당신은 이것을 막 할 수 있습니다 : mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclast

@iconoclast, 그것은 당신이 해석 subdir1하고 subdir2비 문학적 의미 로 목적을 제공합니다 . 교체 subdir1catsubdir2함께 dog예를 들어.
ephsmith

2
@ephsmith : "cat"에 대해 "subdir1"을, "dog"에 대해 "subdir2"를 나타내는 것으로 해석하면 subdir {1,2}를 사용하고 대체 할 수있는 문자열이 없기 때문에 중첩 예제가 실패합니다. "subdir"을 사용하면 subdir {1,2}가 {cat, dog}을 반환합니다.
iconoclast

21

입력을 줄이려고 할 때 사용합니다.

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

또 다른 예:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

개발 중에 실제 테스트 출력을 원하는 테스트 출력과 비교하는 데 사용합니다. 테스트 # 41이 실패하면 테스트 출력 (파일 tests.output / 041)과 원하는 출력 (파일 tests.out / 041)의 차이점을 쉽게 알 수 있습니다.

$ diff tests.{out,output}/041

10

나를 위해 몇 가지 빈번한 경우는 다음과 같습니다.

이름을 바꾸려면 :

mv myText.{txt,tex}

또는

mv myText.tex{,.old}

또는

cp myText.tex{,.backup}

(마지막 2 개의 작업에 버전 제어를 사용하는 것이 덜 지저분하지만)

비교 (이미 언급) :

diff path{1,2}/a.txt

3

여기에는 몇 가지 훌륭한 답변이 있지만 중괄호 확장을 사용 하지 않을 때 언급 하지는 않습니다 . 다른 응답자와 마찬가지로 명령 줄에서 중괄호 확장을 사용합니다. 스마트 쉘을 기대할 수 있기 때문에 별칭과 함수에서도 사용합니다.

나는 할 수 없습니다 (이러한 경우에, 그와 같은 "진짜"스크립트 언어로 업그레이드하는 것이 최선의 방법이지만, 스크립트가 bash는 또는 zsh을해야 다른 이유가없는 한 내 쉘 스크립트에서 사용 perl또는 python). Brace 확장은 POSIX 셸 표준 아니므로 이식 이 불가능합니다. 그것이 당신의 작동하더라도 /bin/sh- 오두막 에드 쉘 스크립트, 그것은 더 제거하는 시스템에서 작동하지 않습니다 /bin/sh쉘 (예를 들어 dash).

한 자릿수가 다른 경우에는 중괄호 확장이 필요하지 않습니다. 캐릭터 클래스로 충분합니다.

배 시즘 :

diff file{1,2}

가지고 다닐 수 있는:

diff file[12]

3
차이는 즉 file{1,2}항상로 확대 될 file1 file2때, file[12]단지 기존의 파일 이름으로 확장 : 경우 즉 file1존재하지만 file2하지 않습니다, file[12]로 확장 file1단지. []확장은 정말의 제한된 버전 ?확장 (그들은 "경로 확장"라고합니다).
musiphil

올바른 중괄호 확장은 쉘 글 로빙 이 아닙니다 (일명 경로 이름 확장). 그것은 아직 언급되지 않은 좋은 설명입니다. 괄호 확장은 예기치 않은 결석 경로에 주목하는 것이 좋습니다. 괄호 확장 내부를 움켜 잡을 수도 있습니다.
Adam Katz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.