首页 > 解决方案 > 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

当我签入存储文本文件的子目录时很好。但是,当我定向到主题的主目录时,它给了我错误。

标签: linuxbash

解决方案


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" {}。 如果搜索未找到您搜索的内容,则 -Lof列出文件名。告诉命令在它找到的当前文件上执行命令。grep{}findgrep

因此它将遍历您的目录,找到每个文件并在每个文件上运行grepgrep将输出不包含文本的文件名。


对于你的脚本,你可以把你的代码放在https://www.shellcheck.net/,它会让你知道你的语法错误并提出解决方案。可能$finished不应该$在那里。我想这是简单的文字。除非你在$finished某处定义了一个变量,但在你放在这里的代码中,它没有被初始化。同样适用$parentdir


推荐阅读