将 grep 的结果传送到 find 中

将 grep 的结果传送到 find 中

我有一个日志文件,其中包含其他事件之间的一些文件名,我需要在子文件夹中找到它们。 xml 文件内的文件名也有同样的必要性,必须在某些文件夹和子文件夹中找到。在我看来,我应该在日志文件上使用 grep 并提取准确的文件名,然后将其提供给查找。我可以轻松地获取每行一个文件名列表,但让它与 find 一起使用并不完全有效。互联网上充满了其他方式的答案 - 找到输入 grep 的结果。

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' /home/myname/log/myspecificlogfile.log

我尝试将此命令的结果通过管道传输到 xargs 并查找,但它在实际不存在的文件和实际存在的文件上都没有给出任何结果。 echo 只是为了简化,find 参数 -ls 尚未添加(但我需要它):

echo 12345.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'    #Nonexisting pdf
echo 67890.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'   #Existing pdf, no results

如何通过管道获取 grep 结果以查找文件夹以及最终子文件夹中的文件?

答案1

我会做:

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' \
  /home/myname/log/myspecificlogfile.log | awk -F / '
     ARGIND == 1 {files[$0]; next}
     $NF in files' - RS='\0' <(
     find /home/myname/workfolders/ -name '*pdf' -type f -print0)

(假设 和 的 GNU 实现grep以及awk支持进程替换的 shell,如ksh,zshbash)。

例如,对于文件名或使用find's-name并不理想。每个文件名运行一次会很低效。即使你创建了一个使用 's 调用的解决方案,其效率可能仍然低于 所做的哈希查找。*.pdf?.pdffindfind-name a.pdf -o -name b.pdf...awk

答案2

使用的其他变体查找+grep

find /home/myname/workfolders/ \
     -name '*pdf' -type f -exec grep -qFf \
          <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)'\
                 /home/myname/log/myspecificlogfile.log) \
     -print

或者你可以用管道将它分成两个命令

find /home/myname/workfolders/ -name '*pdf' -type f |
grep -qFf <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)' \
            /home/myname/log/myspecificlogfile.log)

相关内容