Bash遍历Unix毫秒时间戳文件并筛选大于当前日期文件的问题
Bash 筛选时间戳大于当前日期的文件处理方案
我需要用 Bash 遍历一批以毫秒级Unix时间戳命名的文件(例如1658319357014.txt),筛选出时间戳对应的时间晚于当前日期的文件,过程中遇到两个问题,以下是解决方法:
一、获取当前日期对应的毫秒级Unix时间戳(适配macOS)
最初尝试的GNU风格date命令在macOS下报错:
CURRENT_DATE=$(date +'%Y-%m-%d') CURRENT_TIMESTAMP=$(date +d "$CURRENT_DATE" +%s000)
报错信息:
date: illegal time format
原因是macOS自带的date命令参数与GNU版本不同,需要改用-j(不修改系统时间)和-f(指定输入格式)参数。我已经找到适配macOS的命令:
CURRENT_TIMESTAMP=$(date -jf "%Y-%m-%d-%H-%M-%S" "$(date +%Y-%m-%d-0-0-1)" "+%s"000)
该命令的作用是:将当前日期的00:00:01时刻转换为秒级时间戳,再拼接000得到毫秒级时间戳,以此代表当前日期的起始时刻。
也可以简化为更直接的写法:
CURRENT_TIMESTAMP=$(date -j -f "%Y-%m-%d" "$(date +%Y-%m-%d)" "+%s000")
二、文件名与当前时间戳的数值比较
之前硬编码时间戳比较失败,主要是两个问题:未正确提取文件名中的纯时间戳、误将字符串当作数值比较。解决步骤如下:
- 提取纯时间戳:用Bash参数扩展去掉文件名的
.txt后缀,得到纯数字的时间戳字符串; - 数值比较:用Bash算术扩展
(( ... ))进行整数比较,避免字符串比较的逻辑错误。
完整脚本示例:
# 获取当前日期起始时刻的毫秒级时间戳(macOS) CURRENT_TIMESTAMP=$(date -jf "%Y-%m-%d-%H-%M-%S" "$(date +%Y-%m-%d-0-0-1)" "+%s"000) # 遍历当前目录下所有.txt文件 for file in *.txt; do # 提取文件名中的纯时间戳(移除.txt后缀) file_timestamp=${file%.txt} # 数值比较:文件时间戳大于当前日期起始时间则输出 if (( file_timestamp > CURRENT_TIMESTAMP )); then echo "符合条件的文件:$file" # 可在此添加后续处理逻辑(如移动、复制文件等) fi done
关键说明
${file%.txt}:Bash参数扩展语法,删除变量末尾匹配的.txt字符串,精准提取时间戳数字;(( file_timestamp > CURRENT_TIMESTAMP )):算术扩展支持大整数运算,直接按数值比较两个时间戳,避免字符串比较时的字典序问题。
内容的提问来源于stack exchange,提问作者Szymon Budziak
相关产品推荐
相关产品推荐

