解压缩到管道,然后 运行 流中文件的 PDF 信息
Unzip to pipe and then run PDF info on the files in the stream
我想解压缩很多文件,然后 运行pdfinfo 以获取每个文件的页数以及这些页数的总和。
我遇到了一个命令,可以对目录中所有页面的页面求和。
find . -name \*.pdf -exec pdfinfo {} \; | grep Pages | sed -e "s/Pages:\s*//g" | awk '{ sum += ;} END { print sum; }'
然后我想将其通过管道传输到#unzip -p
unzip -p '*.zip' | find . -name \*.pdf -exec pdfinfo {} \; | grep Pages | sed -e "s/Pages:\s*//g" | awk '{ sum += ;} END { print sum; }'
但是它并没有像我预期的那样工作。我怀疑我的解压缩流与查找的交互效果不佳。
有什么想法吗?
如果您主要关心磁盘空间,这可能会有所帮助:
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
这是一种不向文件系统写入任何内容的方法。如果 zip 文件中的任何文件名包含嵌入的 whitespace,则此代码应该有效。该代码假定以 "pdf" 结尾的文件名是有效的 PDF 文件。
这是我要使用的测试 zip 文件。请注意,zip 存档中的第一个文件名 "zlib 3.pdf" 包含一个 space 字符。
$ 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 += ;} END { print sum; }'
我的测试 zip 文件输出 96。
类似于我需要从 zip 存档中提取 .FLAC 音频文件并即时转换为 .OPUS。这对我有用。首先,我必须制作一个单独的文件名文本文件,以便从每个 zip 存档中提取。没有简单的方法解决这个问题,因为管道可以工作但不传递文件名。获得列表后,您只需 extract/convert 每个 FLAC 从 zip 文件中按名称命名,这样您就知道每个 OPUS 文件的名称。
这依赖于 unzip -p 选项来管道输出。
for zip in *.zip
do
zipinfo -1 "$zip" | grep flac > "$zip"_flacs.txt;
printf -- zip\:...."$zip\n"flac\:..."$flac\n";
cat "$zip"_flacs.txt | while read flac
do
printf "extracting $flac \n";
unzip -p "$zip" "$flac" | ffmpeg -i - -ab 256k "${flac%.*}.opus";
done
done
不要忘记提取其他所有内容。
for zip in *zip; do unzip "$zip" -x *.flac *.mp4; done
我想解压缩很多文件,然后 运行pdfinfo 以获取每个文件的页数以及这些页数的总和。
我遇到了一个命令,可以对目录中所有页面的页面求和。
find . -name \*.pdf -exec pdfinfo {} \; | grep Pages | sed -e "s/Pages:\s*//g" | awk '{ sum += ;} END { print sum; }'
然后我想将其通过管道传输到#unzip -p
unzip -p '*.zip' | find . -name \*.pdf -exec pdfinfo {} \; | grep Pages | sed -e "s/Pages:\s*//g" | awk '{ sum += ;} END { print sum; }'
但是它并没有像我预期的那样工作。我怀疑我的解压缩流与查找的交互效果不佳。
有什么想法吗?
如果您主要关心磁盘空间,这可能会有所帮助:
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
这是一种不向文件系统写入任何内容的方法。如果 zip 文件中的任何文件名包含嵌入的 whitespace,则此代码应该有效。该代码假定以 "pdf" 结尾的文件名是有效的 PDF 文件。
这是我要使用的测试 zip 文件。请注意,zip 存档中的第一个文件名 "zlib 3.pdf" 包含一个 space 字符。
$ 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 += ;} END { print sum; }'
我的测试 zip 文件输出 96。
类似于我需要从 zip 存档中提取 .FLAC 音频文件并即时转换为 .OPUS。这对我有用。首先,我必须制作一个单独的文件名文本文件,以便从每个 zip 存档中提取。没有简单的方法解决这个问题,因为管道可以工作但不传递文件名。获得列表后,您只需 extract/convert 每个 FLAC 从 zip 文件中按名称命名,这样您就知道每个 OPUS 文件的名称。
这依赖于 unzip -p 选项来管道输出。
for zip in *.zip
do
zipinfo -1 "$zip" | grep flac > "$zip"_flacs.txt;
printf -- zip\:...."$zip\n"flac\:..."$flac\n";
cat "$zip"_flacs.txt | while read flac
do
printf "extracting $flac \n";
unzip -p "$zip" "$flac" | ffmpeg -i - -ab 256k "${flac%.*}.opus";
done
done
不要忘记提取其他所有内容。
for zip in *zip; do unzip "$zip" -x *.flac *.mp4; done