如何使用awk按多字段分隔符实现批量重命名文件
问题根因
你之前的awk -F "[.|Data20]"写法存在语法错误:正则中[]表示字符集匹配,会把括号内的每个单个字符都作为分隔符,而非匹配Data20这个完整字符串,所以完全无法拆分出你需要的FSIContract片段。
可行方案
推荐直接用Shell内置的参数扩展实现,不需要额外调用awk,性能更高且逻辑更清晰:
# 定义日期变量,用$()替代反引号兼容性更好 DATE=$(date +'%y%m%d') # 遍历所有匹配规则的原文件 for FILENAME in PFSI4C.CSC.CCC.FSIContractData*.zip; do # 去掉.zip后缀 base_no_suffix=${FILENAME%.zip} # 把开头的P替换为T base_with_T=T${base_no_suffix#P} # 去掉末尾8位旧日期字符 name_prefix=${base_with_T%????????} # 拼接新日期和后缀得到最终文件名 NEW_FILENAME="${name_prefix}20${DATE}.zip" # 先加echo运行验证输出的文件名是否正确,确认没问题后删除echo即可执行重命名 echo mv "$FILENAME" "$NEW_FILENAME" done
如果你偏好使用awk实现,也可以用正则替换直接生成新文件名,写法更简洁:
DATE=$(date +'%y%m%d') for FILENAME in PFSI4C.CSC.CCC.FSIContractData*.zip; do NEW_FILENAME=$(echo "$FILENAME" | awk -v new_date="$DATE" '{ # 替换开头的P为T sub(/^P/, "T"); # 替换末尾的旧日期后缀为新日期 sub(/Data[0-9]{8}\.zip$/, "Data20" new_date ".zip"); print }') echo mv "$FILENAME" "$NEW_FILENAME" done
内容的提问来源于stack exchange,提问作者codehunter-py
相关产品推荐
相关产品推荐

