如何使用单条Bash命令递归查找最新文件早于3天的目录
解决递归查找“最新文件早于3天”的子目录问题
没问题,我刚好有几个实用的方案能满足你的需求!你要的是递归找出所有子目录,且这些目录里没有任何近3天修改过的文件(也就是目录下的最新文件修改时间早于3天),对吧?之前的find -newermt命令确实不符合需求,因为它只会找出包含新文件的目录,而不是反向筛选。
方案一:高效判断(推荐)
这个方法的思路是:对每个目录,检查是否存在任何近3天修改的文件——如果不存在,就输出该目录。用-print -quit可以在找到第一个符合条件的文件时立即停止,避免不必要的遍历,效率更高:
find . -type d -exec bash -c ' # 检查当前目录下是否有3天内修改的文件,找到一个就停止 if ! find "$1" -type f -newermt "3 days ago" -print -quit; then echo "$1" fi ' _ {} \;
方案二:明确获取最新文件时间
如果你需要明确基于目录内最新文件的时间来判断,可以用这个方法:先提取目录内最新文件的时间戳,再和3天前的时间戳对比:
find . -type d -exec bash -c ' # 获取当前目录下所有文件的最新修改时间戳(秒级) latest=$(find "$1" -type f -printf "%T@\n" | sort -n | tail -1) # 计算3天前的时间戳 cutoff=$(date -d "3 days ago" +%s) # 如果目录没有文件,或者最新文件时间早于3天前,就输出目录 if [ -z "$latest" ] || (( latest < cutoff )); then echo "$1" fi ' _ {} \;
可选调整
- 如果只想检查目录直接包含的文件(不递归子目录里的文件),给内部的
find命令加上-maxdepth 1参数即可。 - 如果不需要输出空目录,删除方案二中的
[ -z "$latest" ] ||部分。
内容的提问来源于stack exchange,提问作者Bengi34
相关产品推荐
相关产品推荐

