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



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

我从这里偷了以下片段

如何搜索多个pdf文件的内容?

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

我可以发出此命令来打印文件名吗?

它不一定是"单行"。

谢谢。

不多。只需将命令拆分为一个循环即可。

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 "%sn" ${files[@]} | xargs -n1 -P 6 -I '{}' bash -c 'PDFtoText "$@" || exit 255' arg0 {}
if [[ $? -ne 0 ]]
then
exit 1
fi

为什么不使用类似的东西

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 个进程的输出可能会混合。

相关内容

  • 没有找到相关文章

最新更新