linux - bash检查多个目录中的输出(.txts)是否包含某些字符串
问题描述
我在多个目录中为不同的主题生成了多个 script.txt。现在我需要检查是否所有 script.txt 都包含字符串“完成且没有错误”。如果是,返回ok;如果没有,返回父母目录,这样我就知道哪个科目出了问题。
for i in *
do
if grep "$finished without error" $i; then
echo "ok"
else
echo $parentdir
fi
done
当我签入存储文本文件的子目录时很好。但是,当我定向到主题的主目录时,它给了我错误。
解决方案
for i in *
只会处理调用脚本的目录下的文件。它不会递归地进入目录。
如果你想处理当前目录,以及所有子目录,你应该使用find
来做这样的任务。像这样:
find . -type f -exec grep -L "finished without error" {} \;
这将返回所有不包含finished without error
.
细节:
find .
: 将在当前目录 (.
)上运行查找-type f
: 只会对文件执行操作。遍历目录,但不会在这些目录上尝试 grep。-exec SOMETHING \;
: 将为每个符合find
条件的文件执行 SOMETHING。这里只有一个-type f
。所以它会为每个文件执行一些事情。\;
是让find
论点-exec
完整。- 这里有些东西是:
grep -L "finished without error" {}
。 如果搜索未找到您搜索的内容,则-L
of列出文件名。告诉命令在它找到的当前文件上执行命令。grep
{}
find
grep
因此它将遍历您的目录,找到每个文件并在每个文件上运行grep
。 grep
将输出不包含文本的文件名。
对于你的脚本,你可以把你的代码放在https://www.shellcheck.net/,它会让你知道你的语法错误并提出解决方案。可能$finished
不应该$
在那里。我想这是简单的文字。除非你在$finished
某处定义了一个变量,但在你放在这里的代码中,它没有被初始化。同样适用$parentdir
推荐阅读
- javascript - 显示最后一分钟的可变数字的功能
- polymorphism - 为什么 iife 中的包装函数会导致弱类型?
- windows - 在 URI 中使用带有特殊字符的 invoke-webrequest 会导致 API 调用无法正常工作
- reactjs - 在消费者中使用上下文变量是否有更简单的语法?
- reactjs - default.auth(...).collection 不是函数
- php - 过去 30 天从数据库表中选择 * 不会返回所有元素
- c - C void函数修改指针数组
- amazon-web-services - aws - 我的 lambda 未列在下拉列表中
- python - 如何在批处理文件上停止 python 脚本
- scala - 如何解码嵌套在circe数组中的日期?