如何在Bash循环中实现touch命令的时间戳按秒递增修改已存在文件
如何在Bash循环中实现touch命令的时间戳按秒递增修改已存在文件
嗨,我来帮你搞定这个需求!你要给已存在的50个文件逐个设置间隔2秒递增的时间戳,不用新建文件,只修改现有文件的时间对吧?其实用Bash循环结合date和touch命令就能轻松实现,我给你几个实用的方案:
方案一:针对固定命名的文件(比如file_1到file_50)
这个方案适合你已经知道文件名是按顺序命名的情况,直接指定循环范围即可:
#!/bin/bash # 自定义起始时间,格式可以调整,比如换成"2024-08-01 00:00:00"这种ISO格式也没问题 start_time="1 Aug 2024 00:00:00" # 循环处理50个文件,从file_1到file_50 for i in {1..50} do # 计算当前文件的时间:起始时间加上 (i-1)*2 秒(保证第一个文件是起始时间,后续每次+2秒) current_time=$(date -d "$start_time + $(( (i-1)*2 )) seconds" +"%d %b %Y %H:%M:%S") # 修改文件的访问和修改时间戳 touch -d "$current_time" "file_$i" done
小提示:
- 如果你想从当前时间开始递增,把
start_time改成start_time=$(date +"%d %b %Y %H:%M:%S")就行 - 测试阶段可以把
touch命令换成echo "file_$i -> $current_time",先确认时间序列是否符合预期,再实际修改文件
方案二:灵活遍历任意匹配的文件
如果你的文件名不是固定的file_1格式,而是其他命名规则(比如所有.log文件),可以用计数器来跟踪时间偏移:
#!/bin/bash start_time="1 Aug 2024 00:00:00" # 初始化计数器,用来计算时间偏移量 counter=0 # 遍历当前目录下所有匹配的文件,这里是file_*,你可以改成*.log或者其他模式 for file in file_* do # 按计数器计算时间偏移,每次+2秒 current_time=$(date -d "$start_time + $(( counter*2 )) seconds" +"%d %b %Y %H:%M:%S") touch -d "$current_time" "$file" # 计数器自增 ((counter++)) # 如果只需要处理前50个文件,加上这个判断: # if [ $counter -eq 50 ]; then break; fi done
额外说明
touch -d支持多种时间格式,如果你担心月份缩写(比如Aug)的地域问题,可以改用更标准的ISO 8601格式,示例如下:
start_time="2024-08-01T00:00:00" current_time=$(date -d "$start_time + $(( (i-1)*2 )) seconds" +"%Y-%m-%dT%H:%M:%S")
这种格式几乎不会出现解析错误,兼容性更好。
备注:内容来源于stack exchange,提问作者Miro Lehocky
相关产品推荐
相关产品推荐

