递归查找日志文件,如果没有找到日志则打印“INVALID”(bash)

递归查找日志文件,如果没有找到日志则打印“INVALID”(bash)

我有~750 个日志目录,我需要搜索可用的最新日志文件:

这些由 allLogs.txt 文件捕获,每个条目都包含一个通配符“*”,以便仅抓取具有最新日期的日志(可以有许多具有不同日期的同名日志。例如

import_Asbeg_DA_Config3_*.log

import_test_deploy_*.log

import_Plus_DQ_Config1_*.log

例如,我知道这并不漂亮,但它对于循环实现目标非常有效。

for LATEST in `cat allLogs.txt` ;
do
    find -name "${LATEST}" -type f | sort -n | tail -1

done < infile > outfile

这会找到约 350 条记录,因为所有目录可能都没有日志文件。

“allLogs.txt”包含该目录的日志文件的所有 ~750 个路径。

我试图找出如何在循环中运行此命令,但即使没有找到日志文件,也要保持一致性。也许通过将“无效”附加到不包含日志文件的记录中。我尝试过 echo 与 find 命令的组合,但没有成功。有任何想法吗?

答案1

根据您的问题,我认为您真正要求的是打印目录中的最新文件(如果目录中有任何文件)。如果任何目录中都没有文件,则打印出 INVALID 或类似内容。

如果上面的总结是正确的,您可以在循环中添加一个 if 子句,以检查在该目录上查找时是否仅输出一行。如果只有一行,那就是目录。因此,没有文件。然后,您可以跳过循环中的任何其他命令并继续执行列表中的下一项。

这是更新后的脚本:

#!/bin/bash

for LATEST in $(cat allLogs.txt); do
    if [[ $(find ${LATEST} -print | wc -l) -eq 1 ]]; then
        echo "${LATEST} has no files"
        continue
    fi
    find ${LATEST} -type f | sort -n | tail -1
done

exit 0

我不想只打印 INVALID,因为您不知道哪个目录正在打印 INVALID。

我不确定你为什么要重定向循环的标准输入。我没有重定向标准输出,但这很容易添加。

答案2

如在你已有的答案,我假设您有许多目录,每个目录包含零个或多个文件,这些文件的名称由公共部分加上用于排序的数字组成,并且这些名称的公共部分列在您的文件中allLogs.txt

您可以使用类似的方法为其中没有找到匹配项的outfile每个名称添加一行:allLogs.txtfind

#!/bin/bash

while read -r LATEST; do
  find -name "${LATEST}" -type f | tee >( [ "$(wc -l)" = 0 ] && printf '%s\n' "${LATEST} INVALID" )  | sort -n | tail -1
done < allLogs.txt > outfile

teefind即使找不到任何内容,也会执行进程替换,在这种情况下会打印一条消息。

我把 改为for loopawhile loop让它管理带空格的文件名。输入重定向会相应更改,但这可能不是您想要的。无论如何,它与您的主要问题(如何添加“无效”通知)无关。

答案3

非常感谢大家的帮助!

“printf”是我的朋友!

这段代码解决了我最初的问题...outfile 保持了 ~750 的行完整性...outfile 有点乱,但没有什么不能用 awk、sed 等处理的。

 for LATEST in `cat ${TMPDIR}/AllLogs.txt` ;
    do
      printf "`echo ${LATEST}` `find -name "${LATEST}" -type f | sort -n | tail -1`\n"

    done < infile > outfile

相关内容