숫자 순서가 있는 글로브

숫자 순서가 있는 글로브

내 디렉토리에 다음과 같은 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 -vGNU 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?.pdfc0.pdf c1.pdf…… 로 확장합니다 c9.pdf.  ... c??.pdf로 확장됩니다 (해당하는 경우 최대로 확장됩니다 ). 경로 이름 확장 문자가 포함된 각 명령줄 단어는 변수에 따라 정렬(조합)된 파일 이름 목록으로 확장되지만 , 인접한 와일드카드(와일드카드) 확장으로 인한 목록은 병합되지 않습니다. (쉘 매뉴얼 페이지에 이 내용이 명시적으로 명시되어 있었지만 지금은 찾을 수 없는 것으로 기억됩니다.)c10.pdf c11.pdfc20.pdfc99.pdfLC_COLLATE

물론, 파일에 접근할 수 있다면 c999.pdf그 파일을 사용해야 합니다 c?.pdf c??.pdf c???.pdf. 물론 숫자가 많으면 지루할 수 있습니다. 예를 들어 최대 5자리의 경우 이 옵션을 설정할 c?{,?{,?{,?{,?}}}}.pdfc0.pdf있습니다 . 그렇지 않고 (예를 들어) 두 자리 숫자를 포함하는 파일이 없으면 프로그램에 리터럴 인수가 전달됩니다.c12345.pdfnullglobc??.pdf

접두사가 여러 개인 경우(예: , 및 , 한 자리 또는 두 자리 숫자) 명백한 무차별 접근 방식을 사용할 수 있습니다.a<number>.pdfb<number>.pdfc<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의 경우 "./" 바꾸다""...하나가 작동하지 않으면 다른 것을 시도하십시오)

관련 정보