Linux下根据文件名中的时间修改文件修改时间报错求助
解决批量修改文件时间的问题
你的命令报错主要是因为参数展开语法错误、时间片段提取位置不对,再加上对touch -t的格式要求没匹配上。我来一步步帮你修正:
问题拆解
- 原命令里的
{filename:7:8}是错误的bash参数展开写法,正确格式应该是${变量名:起始索引:长度},你漏了$符号。 - 看你的文件名
IMG_20180101_010101.jpg,从字符索引0开始算:20180101是从第4位(索引4)开始的8个字符,而不是第7位;时间部分010101是从第13位开始的6个字符。 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
相关产品推荐
相关产品推荐

