如何筛选文件名含YYYYMMDDHH24MISS格式的每日最新文件?
按日期筛选每日最新文件的正确方法
问题分析
你需要从命名格式为abc_YYYYMMDDHH24MISS.txt的文件中,提取每日(YYYYMMDD部分)的最新文件。原命令ls | cut -b 1-12|uniq |ls |sort|tail -1逻辑错误:uniq的输出无法传递给ls(ls不会读取管道输入,而是直接列出当前目录所有文件),最终仅能获取全局最新的单个文件,无法按日分组筛选。
解决方案
方法1:sort + awk 分组取最新
利用文件名的时间戳特性,先排序再按日期分组保留每组最后一行(即当日最新文件):
ls abc_*.txt | sort | awk -F '_' '{date=substr($2,1,8)} date!=prev{if(prev!="") print line; prev=date} {line=$0} END{print line}'
命令解释:
ls abc_*.txt:仅列出目标格式的文件,避免无关文件干扰sort:按文件名排序(时间戳为连续数字,排序后同日期文件按时间先后排列,最新的在组内最后)awk逻辑:- 以
_为分隔符,提取文件名中前8位日期部分 - 当日期切换时,打印上一日的最新文件;循环结束后打印最后一日的最新文件
- 以
方法2:Bash循环遍历日期
先提取所有唯一日期,再逐个日期筛选最新文件:
for date in $(ls abc_*.txt | cut -d'_' -f2 | cut -c1-8 | sort -u); do ls abc_${date}*.txt | sort | tail -1 done
命令解释:
ls abc_*.txt | cut -d'_' -f2 | cut -c1-8 | sort -u:提取所有不重复的日期- 循环每个日期,列出该日期的所有文件,排序后取最后一个(当日最新)
验证结果
针对你的输入文件,两种方法都会输出期望结果:
abc_20230101043006.txt abc_20230102043006.txt
内容的提问来源于stack exchange,提问作者dewdrops
相关产品推荐
相关产品推荐

