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


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비 문학적 의미 로 목적을 제공합니다 . 교체 subdir1로 cat와 subdir2함께 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.