我有一个日志文件,其中包含其他事件之间的一些文件名,我需要在子文件夹中找到它们。 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
,zsh
或bash
)。
例如,对于文件名或使用find
's-name
并不理想。每个文件名运行一次会很低效。即使你创建了一个使用 's 调用的解决方案,其效率可能仍然低于 所做的哈希查找。*.pdf
?.pdf
find
find
-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)