Mac下Zsh环境中文件名日期转ISO 8601并修改创建时间求助
在Mac Zsh环境下重命名文件并修改创建时间
完整脚本实现
#!/usr/bin/env zsh # 检查是否传入文件名参数 if [[ -z "$1" ]]; then echo "错误:请传入要处理的文件名作为参数" exit 1 fi original_file="$1" # 提取文件名中的日期片段(匹配格式:"Statement for Apr 14, 2023.pdf" 里的 "Apr 14, 2023") extracted_date=$(echo "$original_file" | sed -E 's/.*for ([A-Za-z]{3} [0-9]{1,2}, [0-9]{4})\.pdf/\1/') # 验证日期提取结果 if [[ -z "$extracted_date" ]]; then echo "错误:无法从文件名中提取日期,请确认格式为 'Statement for Mmm DD, YYYY.pdf'" exit 1 fi # 将提取的日期转换为ISO 8601 UTC格式(如2023-04-14T000000.000Z) iso_date=$(date -j -f "%b %d, %Y" "$extracted_date" "+%Y-%m-%dT000000.000Z") # 生成目标文件名 new_filename="Reported on $iso_date" # 执行重命名操作 mv -v "$original_file" "$new_filename" # 将ISO日期转换为SetFile工具所需的格式(mm/dd/yyyy HH:mm:ss) setfile_date=$(date -j -f "%Y-%m-%dT%H%M%S.000Z" "$iso_date" "+%m/%d/%Y %H:%M:%S") # 修改文件创建时间(需安装Xcode命令行工具,未安装则执行 xcode-select --install) SetFile -d "$setfile_date" "$new_filename" echo "处理完成:文件已重命名为 '$new_filename',创建时间已同步为 $iso_date"
关键步骤说明
- 参数校验:先判断是否传入目标文件,避免无参数运行报错。
- 日期提取:用
sed正则匹配精准提取文件名中的日期部分,确保只捕获月份缩写 日期, 年份的格式。 - 日期格式转换:
- 用
date -j -f "%b %d, %Y"解析提取到的日期字符串,输出符合要求的ISO 8601 UTC格式。 - 再次转换日期格式为
SetFile工具要求的mm/dd/yyyy HH:mm:ss,用于设置文件创建时间。
- 用
- 文件重命名:使用
mv -v完成重命名,-v参数可显示操作详情,方便确认结果。 - 修改创建时间:依赖Mac自带的
SetFile工具(属于Xcode命令行组件),若系统未安装,需先执行xcode-select --install完成安装。
注意事项
- 文件名必须严格匹配
Statement for Mmm DD, YYYY.pdf格式,否则日期提取会失败;若需处理其他后缀,可修改sed正则中的.pdf为\.[a-zA-Z0-9]+以匹配任意后缀。 SetFile专门用于修改文件的创建时间(Birth Time),而touch命令默认仅修改访问和修改时间,无法直接修改创建时间,因此必须使用SetFile。
内容的提问来源于stack exchange,提问作者timtrace
相关产品推荐
相关产品推荐

