我需要ucfirst所有文件recursevly。我找到了ucfirst所有文件的命令,但它不适用于子文件夹
perl -e 's/\.[^\.]*$/rename $_, ucfirst($`) . $&/e for @ARGV' *
如何修改子文件夹文件的命令
感谢
答案 0 :(得分:2)
您可以使用find .
递归获取所有文件。然后,您可以将文件列表传送到Perl程序中。
您需要在程序中进行一些更改,因为它当前从命令行参数接收文件名。如果你输入东西,它来自STDIN。 -n
标志对此很有用。它意味着你拥有的循环,所以你可以删除它。
find . | perl -ne 's/\.[^\.]*$/rename $_, ucfirst($`) . $&/e'
但是,您的正则表达式现在不再匹配,因为您没有foo
,而是./foo
作为输出。你必须改变正则表达式。
find . | perl -nle 'next if -d; $o=$_;s{/([^/]+)$}{"/".ucfirst $1}e; rename $o, $_'
这使用了不同的方法。它保存原始完整文件路径,在最终斜杠/
之后匹配每个文件的名称,并将其替换为ucfirst
。然后重命名。 -l
删除输入末尾的换行符,相当于chomp
。 next if -d
是排除文件夹。如果没有提供arg,-d
将主题变量$_
作为其默认arg,因此我们可以省略它。
$ tree
.
├── bar
│ └── barbar
└── foofoo
1 directory, 2 files
$ find . | perl -nle 'next if -d;$o=$_;s{/([^/]+)$}{"/".ucfirst $1}e; rename $o, $_'
$ tree
.
├── bar
│ └── Barbar
└── Foofoo
1 directory, 2 files
作为Borodin suggested in the comments,您也可以执行此更短的版本,但由于/r
修饰符,您需要at least Perl 5.14,这使得替换返回更改的值,而不是更改$_
并返回成功。
find . | perl -lne 'rename $_, s{([^/]+)$}{ucfirst $1}er unless -d'
请注意,您也可以使用更多代码在Perl中完全构建它,并且不需要find
,但将来可读性更高。请查看File::Find::Rule。
答案 1 :(得分:-1)
谢谢@simbabque,不得不修改行以使其正常工作,这是有效的解决方案
find . -type f | perl -nE 'if(length $_ > 2) {chomp $_;$o=$_;s{/([^/]+)$}{"/".ucfirst $1}e; rename $o, $_}'