如何将所有文件重命名为小写(已解决)并同时将空格重命名为下划线
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'
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')"
我正在尝试将目录树中的所有文件转换为小写,然后将空格移动到下划线或连字符。我能够通过搜索获得的第一部分使用以下代码。
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'
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')"