如何批量移除不同文件名中格式统一的时间戳?
移除文件名中固定格式时间戳的快捷方法
嘿,这个需求我经常碰到,刚好有几个高效的方法能解决,分两种场景给你说清楚——一种是只处理特定日期的时间戳,另一种是批量清除所有符合格式的时间戳,不管日期是什么:
场景1:仅移除特定日期的时间戳(比如只处理20180424的)
假设你只想删掉文件名里带_20180424_的时间戳部分,下面是不同系统的操作方式:
Windows PowerShell 方案
先打开PowerShell,切换到文件所在的目录,然后运行:
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace '_20180424_\d{6}(\..*)?$', '$1' }
小解释:这个命令会遍历当前目录的所有文件,用正则匹配_20180424_后面跟着6位数字的时间部分,同时保留文件的扩展名(比如.txt)。如果你的文件没有扩展名,直接把命令改成-replace '_20180424_\d{6}', ''就行。
Linux/macOS Bash 方案
进入文件所在的终端目录,推荐用rename命令(Debian/Ubuntu默认自带perl版;macOS需要先通过brew install rename安装):
rename 's/_20180424_\d{6}(\..*)?$/$1/' *
要是不想额外安装工具,用循环+sed也能搞定:
for file in *; do new_name=$(echo "$file" | sed 's/_20180424_[0-9]\{6\}//') [ "$new_name" != "$file" ] && mv "$file" "$new_name" done
场景2:移除所有符合格式的时间戳(不限日期)
不管日期是20180424还是20180423,只要是_YYYYMMDD_HHMMSS格式的时间戳都删掉,用下面的方法:
Windows PowerShell 方案
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace '_(\d{8})_(\d{6})(\..*)?$', '$3' }
小解释:正则_(\d{8})_(\d{6})会匹配任意下划线+8位日期+下划线+6位时间的组合,(\..*)?$用来捕获并保留文件扩展名。如果没有扩展名,替换后就自动去掉时间戳部分。
Linux/macOS Bash 方案
用perl版rename一步到位:
rename 's/_\d{8}_\d{6}(\..*)?$/$1/' *
同样,不用rename的话可以用循环:
for file in *; do new_name=$(echo "$file" | sed 's/_[0-9]\{8\}_[0-9]\{6\}//') [ "$new_name" != "$file" ] && mv "$file" "$new_name" done
额外提醒
- 操作前最好先备份文件,避免误删重要内容;
- 如果需要处理子目录里的文件,PowerShell可以加
-Recurse参数,Bash循环可以改成for file in **/*(需要先开启shopt -s globstar); - 文件名里有空格或特殊字符也不用担心,上面的命令都用了引号处理这种情况。
内容的提问来源于stack exchange,提问作者Richard C
相关产品推荐
相关产品推荐

