我一直在努力使这项工作奏效,但是我对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] 删除。
我来说两句