我正在使用 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
请注意,在两种情况下此操作将会失败:
- 如果没有文件与模式匹配的病态情况,将导致一个有点神秘的错误,说:
mv: missing destination file operand after './destination'
- 名称中带有空格的文件会导致问题。
就我个人而言,我并没有费心去想办法解决这两种故障模式,因为我总是分两个阶段运行这种“匹配 + 操作”命令(因此我总是知道是否有零匹配,因此可以跳过操作),并且我严格避免使用带空格的文件名。但如果需要,您可以| sed 's/ /\\ /g
在命令替换管道的末尾添加类似的内容来转义空格。