我有~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.txt
find
#!/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
tee
find
即使找不到任何内容,也会执行进程替换,在这种情况下会打印一条消息。
我把 改为for loop
awhile 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