bash - 解压缩到管道,然后对流中的文件运行 PDF 信息

标签 bash pdf command-line find unzip

我想解压缩很多文件,然后运行 ​​pdfinfo 来获取每个文件的页数以及这些页数的总和。

我遇到了一个命令,它将对目录中所有页面的页面进行求和。

find . -name \*.pdf -exec pdfinfo {} \; | grep Pages | sed -e "s/Pages:\s*//g" | awk '{ sum += $1;} END { print sum; }'

然后我想将其通过管道传输到#unzip -p

unzip -p '*.zip' | find . -name \*.pdf -exec pdfinfo {} \; | grep Pages | sed -e "s/Pages:\s*//g" | awk '{ sum += $1;} END { print sum; }'

但是它并没有像我预期的那样工作。我怀疑我的解压缩流与查找的交互效果很差。

有什么想法吗?

最佳答案

这是一种不向文件系统写入任何内容的方法。如果 zip 文件中的任何文件名包含嵌入的空格,则此代码应该可以工作。该代码假定以“pdf”结尾的文件名是有效的 PDF 文件。

这是我要使用的测试 zip 文件。请注意,zip 存档中的第一个文件名“zlib 3.pdf”包含空格字符。

$ unzip -l aaa.zip 
Archive:  aaa.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    19318  2018-02-19 22:49   zlib 3.pdf
   442780  2018-02-28 15:32   file2.pdf
      757  2018-02-28 15:22   try.sh
---------                     -------
   462855                     3 files

事实证明,pdfinfo 可以从标准输入读取,因此下面的命令展示了如何从存储在 zip 中的 pdf 中获取页数,而无需向磁盘写入任何内容。

$ unzip -p aaa.zip file2.pdf | pdfinfo - | grep Pages
Pages:          94

$ unzip -p aaa.zip "zlib 3.pdf" | pdfinfo - | grep Pages
Pages:          2

为此,您需要知道 zip 存档中存储的 PDF 文件的名称。

下一步是获取 PDF 文件的列表以及存储它们的 zip 文件的名称。这就是此代码的作用

for zip in *.zip ; do 
    echo $zip
    zipinfo -1 "$zip" | grep 'pdf$'| while read pdf
    do
        echo "  '$pdf'" 
    done  
done 

为我输出这个

aaa.zip
  'zlib 3.pdf'
  'file2.pdf'

最后添加调用 pdfinfo 的代码和 awk 代码片段来计算总页数。

for zip in *.zip ; do 
    zipinfo -1 "$zip" | grep 'pdf$'| while read pdf
    do
        unzip  -p "$zip" "$pdf" | pdfinfo - | grep Pages | sed -e "s/Pages:\s*//g"
    done  
done | awk '{ sum += $1;} END { print sum; }'

我的测试 zip 文件输出 96。

关于bash - 解压缩到管道,然后对流中的文件运行 PDF 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48346354/

相关文章:

java - 如何在 html 生成的 itext pdf 中注册印度卢比符号

php - 在 DOMPDF 中打印边距

windows - $之间的区别?和 PowerShell 中的 $LastExitCode

ruby-on-rails - 'bin'中的 '$ bin/rails?'是什么意思

bash - 在本地和远程机器上运行的 Shell 脚本

linux - 如何列出该脚本的输出路径?

bash - 我如何让 $(/bin/printf -6) 返回 -6 而不是认为 -6 是一个选项

c# - 为什么表的第二行不会被写入?

java - 编译代码 - 创建 IDE

linux - 查找 "string1"并删除它和 "string2"之间的内容