使用正则与rename命令批量修改多级目录下WAV文件名的小时字段
批量修改子目录下WAV文件的小时部分
没问题,我来帮你搞定这个批量重命名的需求!针对你这种主目录下多子目录、文件名格式为XXX-日期-小时:分:秒-MXX.wav的场景,这里提供两种实用的方法,你可以根据自己的系统环境选择:
方法一:用Perl版rename(推荐,适合大部分Linux发行版)
大部分主流Linux发行版(比如Ubuntu、Debian)默认自带的是Perl版本的rename,它支持正则表达式和简单的逻辑处理,非常适合这种场景。
场景1:固定替换小时值(比如把所有01小时改成02)
执行以下命令,它会自动遍历/rec下所有子目录的.wav文件,只修改小时部分,保留日期和其他内容:
find /rec -type f -name "*.wav" -exec rename 's/(\d{8})-(\d{2}):/\1-02:/' {} +
- 正则解释:
(\d{8})捕获8位的日期部分(比如27022018),(\d{2}):匹配原来的小时部分;替换时保留捕获的日期,把小时改成02。
场景2:小时值自动递增(比如01→02,23→00)
如果需要把小时统一加1(超过23自动循环到00),可以用带逻辑的Perl脚本:
find /rec -type f -name "*.wav" -exec rename ' if (/(\d{8})-(\d{2}):/) { $new_hour = sprintf("%02d", ($2 + 1) % 24); s/(\d{8})-\d{2}:/$1-$new_hour:/; } ' {} +
- 逻辑说明:先捕获日期和当前小时,计算新小时(加1后对24取模,保证循环),用
sprintf补前导零(比如1→01),再替换原小时部分。
重要测试步骤
先不要直接执行重命名!可以加-n参数预览修改结果,确认无误后再去掉-n:
find /rec -type f -name "*.wav" -exec rename -n 's/(\d{8})-(\d{2}):/\1-02:/' {} +
方法二:用find+mv+sed(兼容所有Linux系统)
如果你的系统是原生rename(比如CentOS、RHEL),不支持Perl语法,可以用bash循环结合sed来实现:
固定替换小时值示例
find /rec -type f -name "*.wav" | while read -r file; do # 提取文件名(不含路径) filename=$(basename "$file") # 用sed替换小时部分,这里把01改成02 new_filename=$(echo "$filename" | sed 's/\([0-9]\{8\}\)-[0-9]\{2\}:/\1-02:/') # 执行重命名 mv "$file" "$(dirname "$file")/$new_filename" done
- 这个方法会逐行处理每个文件,引号包裹变量能避免文件名含空格时出错。
注意事项
- 如果你需要替换的是其他小时值,只需要把命令中的
02改成你目标的小时数即可。 - 确保你对
/rec目录有读写权限,否则会报错。
内容的提问来源于stack exchange,提问作者Isaí Madueño
相关产品推荐
相关产品推荐

