Bash 중괄호 확장에서 변수 사용

Bash 중괄호 확장에서 변수 사용

다음과 같은 순서로 다양한 수의 사진을 생성하는 프로그램이 있습니다. 1.jpg, 2.jpg [...] 10.jpg..etc

10이 2, 3 등보다 먼저 처리되기 때문에 이를 입력으로 사용할 수 없습니다 *.jpg. 따라서 다음을 사용하고 싶습니다.

convert page_{1..$N}.jpg out.pdf

하지만 작동하지 않습니다. 명령은 무엇이어야 합니까?

답변1

파일 이름을 배열에 저장하고 다음을 사용하여 생성할 수 있습니다 seq.

pages=( $(printf 'page_%d.jpg\n' $(seq $N)) )
convert "${pages[@]}" out.pdf

답변2

버팀대 확장이 이루어지기 때문에앞으로변수 대체는 {1..$n}원하는 대로 작동하지 않습니다.피해야 할 좋은 이유eval. 간단한 해결책은 파일 이름을 수정하여 순차적으로 정렬하는 것입니다.

다음 문서를 고려하십시오.

$ ls
page_10.jpg  page_1.jpg  page_2.jpg  page_3.jpg  page_4.jpg  page_5.jpg  page_6.jpg  page_7.jpg  page_8.jpg  page_9.jpg

한 자리 파일 이름 앞에 0을 추가하면 원하는 대로 파일 이름을 정렬할 수 있습니다.

$ for f in ./page_[0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
$ ls
page_01.jpg  page_02.jpg  page_03.jpg  page_04.jpg  page_05.jpg  page_06.jpg  page_07.jpg  page_08.jpg  page_09.jpg  page_10.jpg

이제 다음을 사용할 수 있습니다.

convert *.jpg out.pdf

2자리 숫자를 3자리 숫자로 변환

~처럼스미트 링크위의 내용을 확장하여 2자리 숫자를 3자리 숫자로 변환할 수 있다는 점에 유의하세요.

for f in ./page_[0-9][0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done

예를 들어 위 파일을 사용하면 다음과 같습니다.

$ for f in ./page_[0-9][0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
$ ls
page_001.jpg  page_002.jpg  page_003.jpg  page_004.jpg  page_005.jpg  page_006.jpg  page_007.jpg  page_008.jpg  page_009.jpg  page_010.jpg

답변3

eval중괄호 확장은 변수 대체 전에 수행되므로 반대의 경우에는 다음이 필요합니다.

eval convert page_{1..$N}.jpg out.pdf

또 다른 방법은 확장 파일 이름을 정렬하는 것입니다.

convert $(echo page_*.jpg | tr ' ' '\n' | sort -n -k 2 -t _) out.pdf

관련 정보