我正在尝试搜索超过 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 时才以零退出(成功):
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
使用0
true,因此需要将其反转以获得正确的退出代码 => !(\$2>100)
。因此awk
,在结合两者时,请务必考虑到 和 shell 之间对真与假的对立定义。
Pdftk 也可以以类似的方式使用:pdftk "$1" dump_data
;看这个答案了解更多计算 PDF 文件页数的方法。