批量重命名文件并保留原文件名日期戳的方法咨询
批量重命名文件保留日期部分的解决方案
哈哈,批量重命名这种需求太常见了,我给你两种靠谱的方案,看你习惯用哪种:
方案一:纯Bash循环(兼容性拉满)
这种方法不需要额外安装工具,几乎所有Linux/Unix系统都支持,而且逻辑清晰,容易调整:
# 遍历所有符合原命名格式的文件 for file in filename.New_*.dat; do # 第一步:提取最后一个下划线后的内容(比如20160902.dat) date_part="${file##*_}" # 第二步:去掉.dat后缀,得到纯日期字符串(比如20160902) date_part="${date_part%.dat}" # 执行重命名 mv "$file" "FILE_NAME_NEW.${date_part}.dat" done
小提示:先测试再执行
如果你担心误操作,可以先把mv改成echo mv,这样会打印出将要执行的重命名命令,确认没问题后再改成真实的mv:
for file in filename.New_*.dat; do date_part="${file##*_}" date_part="${date_part%.dat}" echo mv "$file" "FILE_NAME_NEW.${date_part}.dat" done
方案二:用Perl版rename命令(简洁高效)
如果你的系统装的是Perl版本的rename(大部分主流发行版比如Ubuntu、Debian默认都是这个),可以用一行命令搞定,非常简洁:
rename 's/filename\.New_(\d{8})\.dat/FILE_NAME_NEW.$1.dat/' filename.New_*.dat
命令解释
- 正则表达式
filename\.New_(\d{8})\.dat:匹配原文件名,其中(\d{8})会捕获8位数字的日期部分 - 替换成
FILE_NAME_NEW.$1.dat:$1就是刚才捕获的日期,直接替换到新文件名里
检查rename版本
如果不确定自己的rename是不是Perl版,可以运行rename --version,如果输出里有Perl相关的内容,就可以用这个命令;如果是util-linux版本的rename,语法不一样,建议用方案一更稳妥。
扩展:处理子目录里的文件
如果需要处理包括子目录在内的所有符合条件的文件,可以用find命令配合bash循环:
find /your/target/directory -type f -name "filename.New_*.dat" -exec bash -c ' for file do # 提取日期 date_part="${file##*_}" date_part="${date_part%.dat}" # 构造新路径:保留原目录,替换文件名 new_file="${file%/*}/FILE_NAME_NEW.${date_part}.dat" mv "$file" "$new_file" done ' bash {} +
内容的提问来源于stack exchange,提问作者J.Lo
相关产品推荐
相关产品推荐

