다음과 같은 순서로 다양한 수의 사진을 생성하는 프로그램이 있습니다.
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