搜索超过100页的PDF文件并将其移动到UNIX/LINUX终端的目录中

搜索超过100页的PDF文件并将其移动到UNIX/LINUX终端的目录中

我正在尝试搜索超过 100 页的 PDF 文件,然后将它们移动到 UNIX/LINUX 终端中的特定目录中。有点像这样:

find . -name '*.pdf' -pagenumber>100 -exec mv -t ~/directory

显然-pagenumber>100这不是正确的命令。有专门的命令吗?

答案1

这里的难点是计算 PDF 文档的页数。

find实用程序本身无法执行此操作,因此我们需要一个外部工具来执行此操作。

在大多数 Unix 系统上,您将能够安装exiftool.该工具是libimage-exiftool-perlUbuntu 和 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 时才以零退出(成功):

find . -name '*.pdf' -exec sh -c '
  pdfinfo "$1" | awk "/^Pages:/{exit !(\$2>100)}"
' _ {} \; -exec mv {} ~/dir \;

请注意,我们必须转义,\$2因为 Awk 脚本位于双引号内,并且 shell 会扩展$2为位置参数。

awk计算逻辑表达式(\$2>100)并返回1它为 true,而 shell 并find使用0true,因此需要将其反转以获得正确的退出代码 => !(\$2>100)。因此awk,在结合两者时,请务必考虑到 和 shell 之间对真与假的对立定义。

Pdftk 也可以以类似的方式使用:pdftk "$1" dump_data;看这个答案了解更多计算 PDF 文件页数的方法。

相关内容