批量重命名,添加额外的“。” 递归地位于文件名中位置3处的字符

黑R

我一直在努力使这项工作奏效,但是我对regex不太满意。这是我尝试执行的操作,但是没有用(50分钟后,仍然没有明显变化):

while IFS= read -r -d '' file; do mv $file ${file:0:2}.${file:2}; done

提前致谢!

钢铁司机

递归重命名目录中的文件时,您将要面对的一个问题是将文件名(要修改的文件名)与路径分开。您不能简单地删除路径组件,因为那样您的文件将最终被移动而不是简单地重命名。

要使用原始方法,我认为您需要做一些类似的事情

while read -r -d '' f; do 
  file="${f##*/}"; path="${f%/*}" 
  echo mv -- "$path/$file" "$path/${file:0:2}"."${file:2}"
done < <(find -type f -iname "*.wav" -print0)

另一种选择是使用find命令的-execdir而不是-exec认为可以安全地假设结果将以仅一个前导作为路径呈现给您的重命名命令(无论您使用rename还是mv./,在这种情况下,您可以执行

find -type f -iname "*.wav" -execdir rename -nv -- 's|\./..|$&.|' {} +

或使用更Perl-ish的变体

find -type f -iname "*.wav" -execdir rename -nv -- 's|\./..\K|.|' {} +

或使用与您的原始mv方法更等效的方法

find -type f -iname "*.wav" -execdir bash -c 'echo mv -- "$0" "${0:0:4}"."${0:4}"' {} \;

(请注意,子字符串索引已增加2,以允许前导./路径部分)。

如果您的版本find没有此-execdir选项,rename可以修改正则表达式以跳过最长匹配路径前缀,例如

find -type f -iname "*.wav" -exec rename -nv -- 's|.*/..\K|.|' {} +

注:这些表达式都“不操作”在他们(或者重命名的开关-n选项,或echo命令),这样就可以验证他们提交之前做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章