我正在编写一个脚本,该脚本应该在目录中的所有pdf文件中进行搜索。我找到了一个名为" pdftotext"这使我能够在pef文件上使用grep,但我只能用一个文件运行它。当我想在目录中存在的所有文件上运行它然后它失败。有什么建议 ?
这适用于:单个文件
pdftotext my_file.pdf - | grep 'hot'
此操作失败:搜索pdf文件并转换为文本和greping
SHELL PROMPT>find ~/.personal/tips -type f -iname "*" | grep -i "*.pdf" | xargs pdftotext |grep admin
pdftotext version 3.00
Copyright 1996-2004 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
-f <int> : first page to convert
-l <int> : last page to convert
-layout : maintain original physical layout
-raw : keep strings in content stream order
-htmlmeta : generate a simple HTML file, including the meta information
-enc <string> : output text encoding name
-eol <string> : output end-of-line convention (unix, dos, or mac)
-nopgbrk : don't insert page breaks between pages
-opw <string> : owner password (for encrypted files)
-upw <string> : user password (for encrypted files)
-q : don't print any messages or errors
-cfg <string> : configuration file to use in place of .xpdfrc
-v : print copyright and version info
-h : print usage information
-help : print usage information
--help : print usage information
-? : print usage information
SHELL PROMPT 139>
答案 0 :(得分:2)
find . -name '*.pdf' -print0 | xargs -0 -n1 -I '{}' pdftotext '{}' -
默认情况下,xargs会尝试在pdftotext的命令行中插入尽可能多的行。你不希望这样。
你想要的是每次调用一个文件后跟' - '。这可以通过-n1
(每次调用限制为一个参数)和-I '{}'
(make {}作为参数适合的占位符来实现。)
找到的-print0
选项与xargs的-0
选项相结合,使得'\ 0'(空字节)而不是换行符('\ n')作为参数分隔符。
使用-n1
和-I{}
这样的Xargs在语义上与Charles Duffy推荐的find -exec
完全相同。 Xargs的优势在于可以使用多核处理器(它可以一次运行多个pdftotext实例;您可以使用-P
开关配置多少个。)
答案 1 :(得分:1)
xargs
是这项工作的错误工具:find
可以完成内置所需的一切。
find ~/.personal/tips \
-type f \
-iname "*.pdf" \
-exec pdftotext '{}' - ';' \
| grep hot
也就是说,如果 由于某种原因想要使用xargs
,那么正确的用法看起来就像......
find ~/.personal/tips \
-type f \
-iname "*.pdf" \
-print0 \
| xargs -0 -J % -n 1 pdftotext % - \
| grep hot
请注意:
find
命令使用-print0
NUL分隔其输出xargs
命令使用-0
来NUL分隔其输入(这也会导致某些行为导致文件名的错误处理,其名称中包含空格,文字引号等)。 xargs
命令使用-n 1
为每个文件调用pdftotext
xargs
命令使用-J %
指定替换应该发生的位置,并在pdftotext命令行中正确使用%
。