我正在尝试堆叠一个查找命令,以便它返回的结果仅包含其中包含“警告:”或“错误:”文本的文件。我还需要特定格式的这些结果,所以我正在使用exec stat
它。
我可以得到这个版本的工作,但我需要能够-exec stat
在 while 循环中使用来制定一个特定的字符串,这-exec stat
让我的 shell 把>
提示交给我。不工作的部分在下面以粗体显示。
另外,我可以让这些工作。我不能在一起。
这是我工作的一个例子:
find . -type f -exec grep -li error: {} \; | while read -r file; do ls -l "$file"; done
所以现在我正试图用另一个将文件限制为特定时间、类型等的进程来硬塞它。进展不顺利:
查找 /my/directory/here/ -type f -name *.log -mmin -480 -mmin +60 -exec grep -li 警告:{} \; -exec grep -li 错误:{} \; | 同时读取-r文件;执行 -exec stat -c "$file" '%n|%y|%x|%s|%U|%u' {} \; 完毕
-exec stat
请注意,如果我从 while 循环中删除 ,整个事情都会起作用。如果我用简单的 替换它ls -l
,结果会返回给我。现在 shell 只是给我一个命令提示符。
我知道我做的不对,但我现在不知道我应该首先解决什么。
也就是说,你不需要两个
grep
命令的实际输出,只需要退出状态,所以我们-q
用-l
. 不需要while
循环。可能会被多个文件调用,stat
所以我们使用-exec stat ... {} +
. 我还引用了该*.log
模式以防止它扩展到当前目录中的任何此类名称。有关的:
做同样事情的另一种方法:
这用作在子 shell 中运行
find
的循环的路径名生成器。for
然而,这将为包含两种模式匹配的每个文件调用stat
一次,因此它的效率略低。GNU 的 grep(1) 可以进行递归模式匹配:
grep -R warning that-dir
检查下的所有文件
that-dir
。