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

Ale*_*Lee 4 linux terminal find search pdf

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

find . -name '*.pdf' -pagenumber>100 -exec mv -t ~/directory
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 11

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

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

在大多数 Unix 系统上,您将能够安装exiftool. 该工具是libimage-exiftool-perlUbuntu 和p5-Image-ExifToolOpenBSD 上软件包的一部分。它能够执行与媒体文件中的元数据相关的许多操作,例如输出 PDF 文档中的页数:

$ exiftool -s3 -PageCount document.pdf
10
Run Code Online (Sandbox Code Playgroud)

我们可以使用它来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 {} +
Run Code Online (Sandbox Code Playgroud)

这会为批量找到的 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 {} +
Run Code Online (Sandbox Code Playgroud)

您可能想先用mv替换来测试运行它echo

  • @PeterCordes是的,我只选择了“/tmp”,因为它远离“find”可能看起来的位置。我在答案中将其更改为“~/tmp”并添加了注释。要点是避免查看目标目录中的文件。 (2认同)

Qua*_*odo 6

您可以在每个 PDF 文件上运行 Pdfinfo(在 Debian 系统中,从poppler-utils包中),将其通过管道传输到 Awk 来查找该行Pages:,只有当页数大于 100 时才以零退出(成功):

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

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

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

Pdftk 也可以以类似的方式使用:pdftk "$1" dump_data; 有关计算 PDF 文件中页数的更多方法,请参阅此答案。