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

时间:2015-07-25 07:45:26

标签: regex perl file-rename batch-rename

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

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;'

但它似乎无法发挥作用。

3 个答案:

答案 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)

您可以使用:

template <class T>
bool sortPairKey2(T u,  T v) { return u.second < v.second;}

RegEx Demo

答案 2 :(得分:0)

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