使用 pdfgrep 搜索 pdf 中的字符串并仅输出文件名

使用 pdfgrep 搜索 pdf 中的字符串并仅输出文件名

我正在使用 pdfgrep 在 pdf 中搜索名称:

pdfgrep -H 'Fatima Alves' RE/*

此命令将输出文件名和名称:

RE/2011-01-RE_60822079000168_23022016_153923(1).PDF: Fatima Alves   
RE/2011-01-RE_60822079000168_23022016_153923 (2).PDF: Fatima Alves

但我只想打印文件名,不打印: Fatima Alves

因为我想使用带有 xargs 的管道来移动匹配的文件:

pdfgrep -H 'Fatima Alves' RE/* | xargs -I{} mv -i {} ./destination

但在当前情况下,移动不起作用,因为试图移动不存在的文件:

mv: cannot stat ‘RE/2011-01-RE_60822079000168_23022016_153923(1).PDF: Fatima Alves’: No such file or directory
mv: cannot stat ‘RE/2011-01-RE_60822079000168_23022016_153923 (2).PDF: Fatima Alves’: No such file or directory

谢谢。

答案1

您可以pdfgrep像下面这样修改输出以使其可用xargs

$ echo 'RE/2011-01-RE_60822079000168_23022016_153923(1).PDF: Fatima Alves' | grep --perl-regexp --only-matching '.*(?=: Fatima Alves$)'
RE/2011-01-RE_60822079000168_23022016_153923(1).PDF

因此,对于任何给定的正则表达式和pdfgrep输出,您都可以执行以下操作:

regex='Fatima Alves'
pdfgrep -H "$regex" RE/* | grep --perl-regexp --only-matching ".*(?=: $regex\$)"

编辑:

我原本以为 只会打印行的匹配部分pdfgrep。由于它会打印整行,所以我们只需删除包括冒号分隔符在内的所有内容

pdfgrep -H "$regex" RE/* | sed 's/:.*//'

答案2

我发现最简单的方法是逐步构建命令。您可以使用以下命令获取匹配文件名的列表:

$ pdfgrep -i "Fatima Alves" *.pdf | cut -d: -f1 | sort -u

运行上述命令并确保它生成预期的输出后,您可以使用 Bash命令替换$()) 和历史扩展!!)快速重新运行它并移动文件,如下所示:

$ mv $(!!) ./destination

当然,如果您愿意,也可以重新输入整个命令:

$ mv -i $(pdfgrep -i "Fatima Alves" *.pdf | cut -d: -f1 | sort -u) ./destination

请注意,在两种情况下此操作将会失败:

  1. 如果没有文件与模式匹配的病态情况,将导致一个有点神秘的错误,说:mv: missing destination file operand after './destination'
  2. 名称中带有空格的文件会导致问题。

就我个人而言,我并没有费心去想办法解决这两种故障模式,因为我总是分两个阶段运行这种“匹配 + 操作”命令(因此我总是知道是否有零匹配,因此可以跳过操作),并且我严格避免使用带空格的文件名。但如果需要,您可以| sed 's/ /\\ /g在命令替换管道的末尾添加类似的内容来转义空格。

相关内容