使用字符串移动 pdf 并打印 ok 或在每个文件搜索中都找不到

使用字符串移动 pdf 并打印 ok 或在每个文件搜索中都找不到

我使用以下命令和 pdf 在多个 pdf 中搜索特定字符串,如果匹配则移动到目标目录:

pdfgrep -H "DESIRE STRING" TARGET/* | grep --ignore-case --perl-regexp --only-matching '.*(.PDF)'| uniq | xargs -I{} mv -i {} DESTINATION/

如果找到匹配项,我想打印 ok,如果没有匹配项,则打印 not found。是否可以在命令行中包含此功能?

谢谢。

答案1

您尝试在一行命令中执行此操作的原因是什么?它足够复杂,因此将其作为小型 shell 脚本进行管理会更容易。但是,如果您想要一行命令,这里有一个示例,它基本上是一个调用 pdfgrep 的 bash 循环,基于您的示例:

while read line; do file=$(echo $line|awk -F: '{print $1}');printf "$file: "; echo "$line"|grep -q :0$ && echo no match && continue;echo MATCH;mv -i "$file" DESTINATION/;done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc -m 1 "DESIRE STRING" {} \;)

请注意,pdfgrep 使用“-c”选项来确定文本是否在 PDF 文件中。它使用“-m 1”选项在第一次匹配后停止,因此理论上在大文件上运行速度会更快。

如果您的 pdfgrep 不支持“-m 1”选项,请忽略该位。

为了更容易阅读,下面是可能出现在 Bash 脚本中的代码:

#!/bin/bash
while read line; do
  file=$(echo $line|awk -F: '{print $1}')
  printf "$file: "
  echo "$line"|grep -q :0$ && echo no match && continue
  echo MATCH
  mv -i "$file" DESTINATION/
done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc "DESIRE STRING" {} \;)

代码逐行解释:

  1. 这是命令行解释器。如果脚本是可执行的(您可以使用命令“chmod +x mv-pdf-files.sh”使其可执行),您可以像“./mv-pdf-files.sh”一样运行它,它将使用 /bin/bash 来运行脚本。

  2. 这是一个 bash while 循环。它迭代脚本末尾的命令(“find”命令)生成的每一行输出

  3. 这将从输出行中获取文件名并将其保存到变量(名为“文件”)。

  4. 这会将文件名打印到标准输出,末尾没有换行符。

  5. 此 grep 命令在行尾查找“:0”,这表明在该 PDF 中未找到任何与 STRING 匹配的内容。&& 命令链接在一起;因此,如果未找到匹配项,则运行 echo 命令,然后调用 bash“continue”,跳转到循环中的下一个文件(即返回到代码行 #3)。

  6. 这只是表明找到了匹配项。

  7. 这是实际的 mv 命令,与您的代码相同。

  8. “done” 表示 while 循环结束。< <( ) 符号内的“find”命令是 while 循环迭代的内容。find 命令本身只是在指定的路径 (TARGET/) 中查找以 .pdf(不区分大小写)结尾的所有文件。-exec 参数告诉 find 在每个文件上运行“pdfgrep”命令,使用 -H 打印文件名,使用“-c”打印在 PDF 文件中找到的 STRING 的匹配数。末尾的 {} 字符由“find”在内部使用,将文件名表示为变量。

相关内容