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-perl
Ubuntu 和p5-Image-ExifTool
OpenBSD 上软件包的一部分。它能够执行与媒体文件中的元数据相关的许多操作,例如输出 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
。
您可以在每个 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
使用0
true,因此需要将其反转以获得正确的退出代码 => !(\$2>100)
。awk
因此,在结合两者时,请务必考虑到 和 shell 之间对真与假的对立定义。
Pdftk 也可以以类似的方式使用:pdftk "$1" dump_data
; 有关计算 PDF 文件中页数的更多方法,请参阅此答案。
归档时间: |
|
查看次数: |
945 次 |
最近记录: |