Redhat Shell脚本:统计近5天修改文件数量(偏好ls命令)
用ls命令统计近5天更新的文件数量
首先得明确:ls本身没有像find那样的-mtime/ctime这类直接按时间范围过滤的参数,你之前用-mtime是找错了工具——这个参数是find的,不是ls的。不过可以通过ls结合文本处理工具来实现需求,下面是几种可行的方法:
方法1:ls + awk + 日期计算
利用ls的长格式输出提取修改时间,再用awk对比日期:
# 先算出5天前的日期,格式和ls输出一致(比如"Oct 10") five_days_ago=$(date -d "-5 days" +"%b %d") # 输出文件列表,过滤出近5天修改的文件(排除目录),统计数量 ls -l --time-style="+%b %d" | awk -v target="$five_days_ago" '$6" "$7 >= target && $1 !~ /^d/' | wc -l
--time-style="+%b %d":强制ls输出“月份缩写 日期”的时间格式,避免格式不一致导致匹配失败$6" "$7 >= target:对比文件修改日期是否在5天前之后$1 !~ /^d/:排除目录(如果要统计目录就删掉这部分)
方法2:ls + grep(仅适合当月内统计)
如果当前统计的时间范围在同一个月里,可以用grep匹配日期范围:
# 生成5天内的日期区间 start_day=$(date -d "-5 days" +"%d") end_day=$(date +"%d") current_month=$(date +"%b") # 筛选对应月份、日期在区间内的文件,统计数量 ls -l | grep -E "^-.*$current_month ($start_day|$(seq $((start_day+1)) $end_day))" | wc -l
注意:跨月份时(比如从10月30日到11月4日)这个方法会失效,因为月份缩写变了。
题外话:更可靠的方案还是用find
ls的核心功能是列文件,不是过滤文件,它的时间输出格式会随系统设置、文件新旧(比如超过半年的文件会显示年份而非日期)变化,很容易出现匹配错误。如果能接受用find,这命令靠谱得多:
# 统计当前目录下近5天修改的文件(不递归子目录) find . -maxdepth 1 -type f -mtime -5 | wc -l
-maxdepth 1:只看当前目录,不深入子目录-type f:只统计文件,去掉的话会包含目录-mtime -5:精准匹配修改时间在5天以内的文件
内容的提问来源于stack exchange,提问作者heisenberg
相关产品推荐
相关产品推荐

