如何按分类保留YYYYMMDDHHMM命名的最新文件并删除旧文件
保留分类文件中最新版本的解决方案
需求背景
你需要处理一批按文件名前缀分类的文件,每个文件名的后缀是YYYYMMDDHHMM格式的时间戳。核心目标是:针对每个前缀分类,只保留该分类下时间戳最新的文件,删除其他所有旧文件。
示例文件列表
"10MX232 .201801070702.txt" >>old file "10MX232 .201801080703.txt" >>old file "10MX232 .201801161651.txt" >>old file "10MX232 .201801181531.txt" >>old file "10MX232 .201805120846.txt" >>----new file "1465LY1 .201804051311.txt" >>old file "1465LY1 .201805101441.txt" >>old file "1465LY1 .201805110912.txt" >>old file "1465LY1 .201805111419.txt" >>----new file "17NX232 .201801250054.txt" >>old file "17NX232 .201801260055.txt" >>old file "17NX232 .201801270055.txt" >>old file "17NX232 .201801280056.txt" >>old file "17NX232 .201801290057.txt" >>old file "17NX232 .201801300058.txt" >>----new file
期望执行结果
清理完成后,目录下仅保留各分类的最新文件:
ls 10MX232 .201805120846.txt 1465LY1 .201805111419.txt 17NX232 .201801300058.txt
实现方案(Shell脚本)
下面是一个适用于Linux/Unix环境的Shell脚本,能自动完成分组筛选和旧文件删除:
#!/bin/bash # 遍历所有唯一的文件前缀分类 for prefix in $(ls *.txt | sed -E 's/^([^.]+)\..*\.txt/\1/' | sort -u); do # 列出当前分类下的所有文件,按时间戳倒序,跳过最新的那个,删除其余旧文件 ls "${prefix}".*.txt | sort -r | tail -n +2 | xargs rm -f done
脚本细节解释
sed -E 's/^([^.]+)\..*\.txt/\1/':从文件名中提取前缀部分(第一个.之前的内容)sort -u:去除重复的前缀,得到所有独立的分类ls "${prefix}".*.txt | sort -r:列出当前分类的所有文件,并按文件名(即时间戳)倒序排列,最新文件排在首位tail -n +2:跳过排序后的第一个文件(最新的),获取所有需要删除的旧文件xargs rm -f:批量删除这些旧文件
⚠️ 重要提示:执行脚本前请先测试!把
rm -f替换成echo,先确认要删除的文件是否正确,避免误删重要数据。
内容的提问来源于stack exchange,提问作者denememal
相关产品推荐
相关产品推荐

