Bash如何根据文件名中的时间戳范围筛选列出指定txt文件
文件名时间区间筛选解决方案
原有命令失效原因
你使用的awk '/1900/,/2100/'是awk的行范围匹配模式,逻辑为:从第一次匹配到包含字符串1900的行开始输出,直到第一次匹配到包含字符串2100的行停止输出。该逻辑既不会逐行判断时间数值是否在目标区间内,你的文件名中也没有正好携带1900/2100字符串的项,因此无法得到正确结果。
可行解决方案
方案1:awk提取时间字段做数值比较(最稳妥,推荐)
通过下划线分割文件名,提取出时分字段转成数值做区间判断,适配所有符合命名规则的文件:
cd /home/somedir/files; ls *.txt | awk -F '_' '$3 >= 1900 && $3 < 2100'
逻辑说明:
-F '_'指定按下划线分割文件名$3取分割后的第三个字段,也就是文件名中的时分部分(如1911/2020)- 数值判断条件仅保留19:00到20:59之间的文件,和你的需求完全匹配
如果需要对筛选出的文件做后续操作(如移动、删除),避免解析ls输出可以用find配合:
find /home/somedir/files -maxdepth 1 -type f -name "*.txt" | awk -F '_' '$3 >= 1900 && $3 < 2100'
方案2:正则匹配快速筛选
通过正则匹配时分部分为19/20开头的四位数字,适合快速过滤:
cd /home/somedir/files; ls *.txt | grep -E '^file_[0-9]+_(19|20)[0-9]{2}_[0-9]\.txt$'
测试效果
对给出的示例文件名执行上述命令,输出结果完全符合预期:
file_20210122_1911_1.txt file_20210122_2009_1.txt file_20210122_2020_1.txt
内容的提问来源于stack exchange,提问作者Amp
相关产品推荐
相关产品推荐

