100페이지가 넘는 PDF 파일을 검색하여 UNIX/LINUX 터미널에서 특정 디렉터리로 이동하려고 합니다. 이 같은:
find . -name '*.pdf' -pagenumber>100 -exec mv -t ~/directory
분명히 -pagenumber>100
이것은 올바른 명령이 아닙니다. 특별한 명령이 있나요?
답변1
여기서 어려운 점은 PDF 문서의 페이지 수를 계산하는 것입니다.
유틸리티 find
자체로는 이 작업을 수행할 수 없으므로 이를 수행하려면 외부 도구가 필요합니다.
대부분의 Unix 시스템에서는 를 설치할 수 있습니다 exiftool
. 이 도구는 libimage-exiftool-perl
Ubuntu 및 OpenBSD 패키지의 일부 입니다 p5-Image-ExifTool
. PDF 문서의 페이지 수를 출력하는 등 미디어 파일의 메타데이터와 관련된 많은 작업을 수행할 수 있습니다.
$ exiftool -s3 -PageCount document.pdf
10
이를 사용하여 find
100페이지가 넘는 문서를 별도의 디렉터리로 이동할 수 있습니다.
mkdir -p ~/tmp/100-plus-pages || exit
find . -name '*.pdf' -type f -exec sh -c '
for pathname do
if [ "$(exiftool -s3 -PageCount "$pathname")" -gt 100 ]; then
mv "$pathname" ~/tmp/100-plus-pages
fi
done' sh {} +
이는 발견된 PDF 파일 배치에 대한 짧은 인라인 스크립트를 호출합니다. 인라인 스크립트는 발견된 파일의 현재 배치를 반복하고 exiftool
각 파일에 대해 명령을 실행합니다. 명령으로 출력된 숫자가 100보다 크면 파일은 디렉토리로 이동 100-plus-pages
됩니다 ~/tmp
.
우리는 대상 디렉토리에서 PDF 파일을 검색하는 것을 피하고 싶기 때문에 아래에 해당 디렉토리를 만들기로 선택했습니다 ~/tmp
(검색 위치와는 별개이지만 find
동일한 파일 시스템에 있기를 원할 수도 있음). 현재 디렉토리에 유지하려면 다음을 수행하여 입력을 피할 수도 있습니다.
mkdir -p 100-plus-pages || exit
find . -path ./100-plus-pages -prune -o -name '*.pdf' -type f -exec sh -c '
for pathname do
if [ "$(exiftool -s3 -PageCount "$pathname")" -gt 100 ]; then
mv "$pathname" 100-plus-pages
fi
done' sh {} +
mv
먼저 바꾸기를 사용하여 테스트 실행 해 볼 수도 있습니다 echo
.
답변2
poppler-utils
각 PDF 파일에서 Pdfinfo(Debian 시스템의 경우 패키지에서)를 실행하고 이를 Awk로 파이프하여 행을 찾은 다음 페이지 Pages:
수가 100보다 큰 경우에만 0(성공)으로 종료할 수 있습니다.
find . -name '*.pdf' -exec sh -c '
pdfinfo "$1" | awk "/^Pages:/{exit !(\$2>100)}"
' _ {} \; -exec mv {} ~/dir \;
\$2
Awk 스크립트는 큰따옴표 안에 있고 쉘은 $2
위치 인수로 확장되므로 이스케이프해야 한다는 점에 유의하세요 .
awk
논리식은 평가되어 이를 true로 (\$2>100)
반환하고 1
쉘은 true를 find
사용 하므로 0
올바른 종료 코드 =>를 얻으려면 이를 반대로 해야 합니다 !(\$2>100)
. 따라서 awk
둘을 결합할 때 쉘과 쉘 사이의 true 및 false에 대한 반대 정의를 고려해야 합니다.
Pdftk도 비슷한 방식으로 사용할 수 있습니다: pdftk "$1" dump_data
;참조이 답변PDF 파일의 페이지 수를 계산하는 방법에 대해 자세히 알아보세요.