You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下根据文件名中的时间修改文件修改时间报错求助

解决批量修改文件时间的问题

你的命令报错主要是因为参数展开语法错误、时间片段提取位置不对,再加上对touch -t的格式要求没匹配上。我来一步步帮你修正:

问题拆解

  1. 原命令里的{filename:7:8}是错误的bash参数展开写法,正确格式应该是${变量名:起始索引:长度},你漏了$符号。
  2. 看你的文件名IMG_20180101_010101.jpg,从字符索引0开始算:20180101是从第4位(索引4)开始的8个字符,而不是第7位;时间部分010101是从第13位开始的6个字符。
  3. touch -t要求的时间格式是[[CC]YY]MMDDhhmm[.ss],比如201801010101.01就对应2018-01-01 01:01:01。

修正后的完整命令

find . -iname 'IMG*' -print | while IFS= read -r filename; do
  # 提取文件名里的日期部分(20180101)
  date_segment="${filename:4:8}"
  # 提取文件名里的时间部分(010101)
  time_segment="${filename:13:6}"
  # 拼接成touch命令需要的格式:201801010101.01
  target_time="${date_segment}${time_segment:0:4}.${time_segment:4:2}"
  # 执行修改文件时间的操作
  touch -t "$target_time" "$filename"
done

命令细节解释

  • IFS= read -r filename:避免文件名包含空格或特殊字符时出现读取错误,-r参数防止反斜杠被意外转义。
  • ${filename:4:8}:从文件名第4个字符开始截取8个字符,精准拿到日期字符串20180101。
  • ${filename:13:6}:从第13个字符开始截取6个字符,拿到时间字符串010101。
  • ${time_segment:0:4}取时间的前4位(时分:0101),${time_segment:4:2}取后2位(秒:01),拼接后完全符合touch -t的格式要求。

提前验证小技巧

你可以先拿单个文件测试格式是否正确,避免批量执行出问题:

filename="IMG_20180101_010101.jpg"
date_segment="${filename:4:8}"
time_segment="${filename:13:6}"
target_time="${date_segment}${time_segment:0:4}.${time_segment:4:2}"
echo "$target_time"

如果输出是201801010101.01,说明格式没问题,再执行完整命令就不会报错了。

内容的提问来源于stack exchange,提问作者redleo85

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:02:16