UC首先将所有文件recursevly

时间:2017-03-12 19:36:02

标签: linux perl

我需要ucfirst所有文件recursevly。我找到了ucfirst所有文件的命令,但它不适用于子文件夹

perl -e 's/\.[^\.]*$/rename $_, ucfirst($`) . $&/e for @ARGV' *

如何修改子文件夹文件的命令

感谢

2 个答案:

答案 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删除输入末尾的换行符,相当于chompnext 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, $_}'