중첩된 중괄호 확장 및 명령 대체

중첩된 중괄호 확장 및 명령 대체

디렉터리에 이름에 1부터 N까지의 숫자가 포함된 모든 파일이 포함되어 있는지 확인하는 간단한 bash 스크립트를 만들고 싶습니다.

# Creating some files for testing
$ cd /tmp/
$ mkdir test
$ touch test/a01x.dat
$ touch test/b02y.dat

# Display dir contents
$ ls test/*{01,02}*
test/a01x.dat  test/b02y.dat

그러나 seq숫자를 생성하기 위해 명령을 사용하면 다음과 같은 결과가 생성됩니다.

$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory

작은따옴표로 묶인 경로를 통해 명령을 실행하면 와일드카드가 확장되지 않기 때문에 확실히 오류가 발생한다는 것을 알고 있습니다.

$ ls 'test/*{01,02}*'

그러나 나는 그것들을 사용하지 않았습니다. 문제가 무엇입니까?

답변1

문제는 쉘이 {...,...}명령 대체(부분적으로)를 수행하기 $(...)전에 중괄호 확장(처리)을 수행한다는 것입니다. 따라서 seq확장 후 쉘은 이를 다시 계산하지 않고 {01,02}리터럴로 남겨둡니다.

eval명령 대체를 수행한 후 표현식을 다시 평가하도록 하려면 하나를 추가해야 합니다 .

$ eval "ls test/*{$(seq -s , -f "%02g" 1 2)}*"

이 경우 명령 대체가 먼저 수행되어 문자열을 생성한 ls test/*{01,02}*다음 eval셸에서 명령으로 해석하도록 요청한 다음 중괄호와 전역 확장을 수행하여 원하는 파일 목록을 생성합니다.

관련 정보