如何将所有文件重命名为小写(已解决)并同时将空格重命名为下划线

How to rename all files to lowercase (solved) and simultaneously spaces to underscores

我正在尝试将目录树中的所有文件转换为小写,然后将空格移动到下划线或连字符。我能够通过搜索获得的第一部分使用以下代码。

find . -depth -print0 | xargs -r0 perl-rename -n 's/(.*)\/([^\/]*)/\/\L/;'

现在我正在尝试扩展它以在单个正则表达式中也将空格移动到 _ 但直到现在都没有成功。我尝试了 \K 运算符的各种组合,因为我认为这样做是可能的。你能帮帮我吗?我尝试的最后一个命令是,

find . -depth -print0 | xargs -r0 perl-rename -n 's/(.*)\/([^\/]*)/\/\L/;s/(.*)\/\K(\S+)\s+\g1/_/g;'

不过好像不行。

您可以使用:

find . -depth -print0 | 
   xargs -0 perl-rename -n 's~([^/]+)$~\L~;s~(?:.*/|\G)\K(\S+)\s+(?![^/]*/)~_~g'

RegEx Demo

find . -depth -print0 | 
xargs -r0 perl-rename -n  's!([^/]+$)!lc( =~s/ /_/gr)!e'

正如 anubhava 指出的那样,问题在于在处理树时更改目录名称。这类似于在迭代时修改 Perl 散列的问题

这就是 File::Find module's finddepth 函数的用途。它只会在即将退出扫描之前报告一个目录名称,并且报告所有内容之后

只要你是运行Perl v5.14或更高版本,这样tr///就会接受非破坏性替代修饰符/r,你可以写成一行像这样

perl -MFile::Find=finddepth -e"finddepth(sub{ rename $_, tr/A-Z /a-z_/r }, '/path/to/root/dir')"