编写Shell脚本将Unix时间戳文件名转换为标准日期格式
批量将Unix时间戳命名的tar.gz文件重命名为日期格式
没问题,我来帮你搞定这个批量重命名的需求!下面是一个实用的Shell脚本,结合do-while循环实现你要的功能,还会帮你规避一些常见的坑(比如文件名含空格的情况)。
完整脚本
#!/bin/bash # 遍历当前目录下所有以数字开头的.tar.gz文件(避免误处理其他文件) find . -maxdepth 1 -type f -name "[0-9]*.tar.gz" | while read -r old_file; do # 提取文件名中的Unix时间戳(去掉.tar.gz后缀) timestamp=$(basename "$old_file" .tar.gz) # 验证时间戳是否有效(避免无效时间戳导致date命令报错) if ! date -d @"$timestamp" >/dev/null 2>&1; then echo "警告:无效时间戳 $timestamp,跳过文件 $old_file" continue fi # 将时间戳转换为YY_MM_DD_H_M_S格式的新文件名 new_name=$(date -d @"$timestamp" +"%y_%m_%d_%H_%M_%S").tar.gz # 执行重命名操作,-v选项可以显示重命名过程 mv -v "$old_file" "$new_name" done
脚本细节解释
find命令:-maxdepth 1确保只处理当前目录的文件(不递归子目录),-type f指定只处理文件,[0-9]*.tar.gz过滤出以数字开头的tar.gz文件,避免误操作其他命名的文件。read -r:-r选项防止文件名中的反斜杠被转义,完美处理文件名含空格的情况。basename:用来提取文件名中的时间戳部分,比如1620000000.tar.gz会被处理成1620000000。- 时间戳验证:通过
date -d @"$timestamp"的返回值判断时间戳是否有效,无效的话会跳过并给出警告,避免脚本中断。 date格式参数:%y是两位年份,%m两位月份,%d两位日期,%H24小时制小时,%M分钟,%S秒,组合起来正好是你需要的YY_MM_DD_H_M_S格式。mv -v:-v(verbose)选项会输出每一次重命名的详情,方便你确认操作是否正确。
使用方法
- 将上述脚本保存为
rename_tar.sh - 给脚本添加执行权限:
chmod +x rename_tar.sh - 进入存放tar.gz文件的目录,运行脚本:
./rename_tar.sh
如果需要递归处理子目录里的文件,只需要去掉find命令中的-maxdepth 1参数即可。
内容的提问来源于stack exchange,提问作者akm




