解压缩到管道,然后在流中的文件上运行PDF信息

问题描述 投票:1回答:2

我想解压缩大量文件,然后运行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; }'

然而,它没有像我期望的那样工作。我怀疑我的解压缩流与find的交互性很差。

有什么想法吗?

bash pdf command-line find unzip
2个回答
1
投票

这是一种不向文件系统写入任何内容的方法。如果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可以从stdin中读取,因此下面的命令显示了如何从存储在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。


0
投票

如果主要关注磁盘空间,这可能会有所帮助:

for zip in *.zip ;do
    for pdf in $(unzip -l "$zip"  | grep 'pdf$' | cut -c31-) ; do
        unzip "$zip" "$pdf"
        pdfinfo "$pdf" | sed -n "s/Pages:\s*//p"
        rm "$pdf"
     done | paste -s -d+ - | bc
done
© www.soinside.com 2019 - 2024. All rights reserved.