当我找到多个pdf文件,xarg pdftotext和grep模式时,文件名会丢失

时间:2015-04-23 15:05:35

标签: bash pdf grep find xargs

我想制作一个shell脚本来搜索pdf文件中的模式(让它们成为我自己的语料库!)

我从这里偷走了以下片段

How to search contents of multiple pdf files?

find /path/to/folder -name '*.pdf' | xargs -P 6 -I % pdftotext % - | grep -C1 --color "pattern"

,输出看起来像这样

--
--
small deviation of γ from the average value  0.33 triggers
a qualitative difference in the evolution pattern, even if the

我可以使用此命令打印文件名吗?

它不一定是"单行"。

谢谢。

2 个答案:

答案 0 :(得分:1)

不多。只需将命令分成一个循环。

find /path/to/folder -name '*.pdf' | while read file
do
echo "$file"
pdftotext "$file" | grep -C1 --color "pattern" && echo "$file"
done
编辑:我刚刚注意到这个例子包含了一个并行的xargs命令。这在循环中解决并非不可能。你可以写pdftotext& grep命令进入函数,然后使用xargs

EDIT2:仅在匹配时打印文件

它可能看起来像这样:

#!/bin/bash

files=$(find /path/to/folder -name '*.pdf')

function PDFtoText
{

file="$1"

if [ "$#" -ne "1" ]
then
    echo "Invalid number of input arguments"
    exit 1
fi

pdftotext "$file" | grep -C1 --color "pattern" && echo "$file"

}
export -f PDFtoText


printf "%s\n" ${files[@]} | xargs -n1 -P 6 -I '{}' bash -c 'PDFtoText "$@" || exit 255' arg0 {}

if [[ $? -ne 0 ]]
then
exit 1
fi

答案 1 :(得分:0)

为什么不使用

之类的东西
find /path/to/folder/ -type f -name '*.pdf' -print0 | \
  xargs -0 -I{} \
  sh -c 'echo "===== file: {}"; pdftotext "{}" - | grep -C1 --color "pattern"'

它始终打印文件名。你认为这是一个可以接受的妥协吗?否则,echo部分可以在grep之后移动&&,如前所述。

我更喜欢将-print0-0结合使用来处理带空格的文件名。

我删除-P6选项,因为并行的6个进程的输出可能会混合。