我正在尝试将目录树中的所有文件转换为小写,然后将空格移动到下划线或连字符。我通过搜索使用以下代码获得的第一部分。
find . -depth -print0 | xargs -r0 perl-rename -n 's/(.*)\/([^\/]*)/$1\/\L$2/;'
现在我正在尝试扩展它以将空格移动到_也在单个正则表达式中但直到现在都没有成功。我尝试使用\ K运算符的各种组合,因为我认为它是可能的。你能帮帮我吗?我试过的最后一个命令是,
find . -depth -print0 | xargs -r0 perl-rename -n 's/(.*)\/([^\/]*)/$1\/\L$2/;s/(.*)\/\K(\S+)\s+\g1/_/g;'
但它似乎无法发挥作用。
答案 0 :(得分:2)
正如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')"
答案 1 :(得分:0)
答案 2 :(得分:0)
find . -depth -print0 |
xargs -r0 perl-rename -n 's!([^/]+$)!lc($1 =~s/ /_/gr)!e'