내 디렉토리에 다음과 같은 PDF 파일 목록이 있습니다.
c0.pdf c12.pdf c15.pdf c18.pdf c20.pdf c4.pdf c7.pdf
c10.pdf c13.pdf c16.pdf c19.pdf c2.pdf c5.pdf c8.pdf
c11.pdf c14.pdf c17.pdf c1.pdf c3.pdf c6.pdf c9.pdf
Ghostscript를 사용하여 숫자 순서로 이들을 연결하고 싶습니다(이와 유사).
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf *.pdf
그러나 쉘 확장 순서는 숫자의 자연 순서가 아닌 알파벳 순서를 재현합니다.
$ for f in *.pdf; do echo $f; done
c0.pdf
c10.pdf
c11.pdf
c12.pdf
c13.pdf
c14.pdf
c15.pdf
c16.pdf
c17.pdf
c18.pdf
c19.pdf
c1.pdf
c20.pdf
c2.pdf
c3.pdf
c4.pdf
c5.pdf
c6.pdf
c7.pdf
c8.pdf
c9.pdf
확장명에서 원하는 순서를 어떻게 달성할 수 있습니까(가능한 경우 0
파일 이름의 숫자에 -padding을 수동으로 추가하지 않고)?
사용법 제안을 찾았 ls | sort -V
지만 내 특정 사용 사례에 맞게 작동하도록 할 수 없습니다.
답변1
다시,zsh에 대한 glob 한정자구조하러 오세요.
echo *.pdf(n)
답변2
환경에 따라 ls -v
GNU coreutils를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=out.pdf $(ls -v)
또는 최신 버전의 FreeBSD 또는 OpenBSD를 사용하는 경우:
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=out.pdf $(ls | sort -V)
답변3
모든 관련 파일에 동일한 접두사가 있는 경우(예: 번호 앞의 텍스트, c
이 경우) 다음을 사용할 수 있습니다.
GS …매개변수… c?.pdf c??.pdf
c?.pdf
c0.pdf
c1.pdf
…… 로 확장합니다 c9.pdf
. ... c??.pdf
로 확장됩니다 (해당하는 경우 최대로 확장됩니다 ). 경로 이름 확장 문자가 포함된 각 명령줄 단어는 변수에 따라 정렬(조합)된 파일 이름 목록으로 확장되지만 , 인접한 와일드카드(와일드카드) 확장으로 인한 목록은 병합되지 않습니다. (쉘 매뉴얼 페이지에 이 내용이 명시적으로 명시되어 있었지만 지금은 찾을 수 없는 것으로 기억됩니다.)c10.pdf
c11.pdf
c20.pdf
c99.pdf
LC_COLLATE
물론, 파일에 접근할 수 있다면 c999.pdf
그 파일을 사용해야 합니다 c?.pdf c??.pdf c???.pdf
. 물론 숫자가 많으면 지루할 수 있습니다. 예를 들어 최대 5자리의 경우 이 옵션을 설정할 c?{,?{,?{,?{,?}}}}.pdf
수 c0.pdf
있습니다 . 그렇지 않고 (예를 들어) 두 자리 숫자를 포함하는 파일이 없으면 프로그램에 리터럴 인수가 전달됩니다.c12345.pdf
nullglob
c??.pdf
접두사가 여러 개인 경우(예: , 및 , 한 자리 또는 두 자리 숫자) 명백한 무차별 접근 방식을 사용할 수 있습니다.a<number>.pdf
b<number>.pdf
c<number>.pdf
a?.pdf a??.pdf b?.pdf b??.pdf c?.pdf c??.pdf
아니면 {a,b,c}?{,?}.pdf
.
답변4
Thor의 답변을 인용하고 수정하는 것뿐입니다. ls를 구문 분석하지 마십시오!
sort -V
(정렬을 위해 POSIX가 아닌 확장)을 사용할 수 있습니다 .
printf '%s\0' ./* | sort -zV \
| xargs -0 gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH \
-sDEVICE=pdfwrite -sOutputFile=out.pdf
(일부 명령의 경우 gs의 경우 "./" 바꾸다""...하나가 작동하지 않으면 다른 것을 시도하십시오)