以下是我的查询,以下是我的目录结构。
`-- ka
|-- ka.html
`-- ka_tal
|-- tal_cation
| |-- tal_cation.html
| `-- ev1
| `--ka_ka_tal_tal_cation_v1.html
|
`-- ka_tal.html
这里每个.html文件都有一个名为tevision的单词我要将所有单词tevision重命名为ev.so我尝试过以下代码。但它不适用于我。
finddepth(sub {
return unless -d;
(my $new = $_) =~ s/tevision/ev/ or return;
rename $_, $new or warn "Err renaming $_ to $new in $File::Find::dir: $!";
}, ".");
如何使用perl重命名.html文件中的所有单词?
答案 0 :(得分:2)
在File :: Find调用的子例程中,$_
变量将包含已找到的文件的名称。您的代码似乎认为它将包含该文件的内容。要获取文件的内容,您需要打开文件并阅读内容。然后,您需要进行转换并将更改的内容写回原始文件。
使用Unix find
命令和Perl的命令行选项的组合可以轻松得多。可能有助于为单个文件计算解决方案,然后使用find
在所有必需文件上执行该命令。
$ perl -i -pe 's/tevision/ev/' some_file.html
这需要一个文件(some_file.html),打开它并处理文件。
$_
中,并且在每次循环迭代后打印$_
的内容。然后我们可以将它放入find
命令中以获得您想要的完整行为。
$ find . -name "*.html" -exec perl -i -pe 's/tevision/ev/' {} \;
以下内容效率更高,因为它们不会启动perl
的多个实例:
$ find . -name "*.html" -exec perl -i -pe 's/tevision/ev/' {} + # Requires GNU find
$ find . -name "*.html" -print0 | xargs -0 perl -i -pe 's/tevision/ev/'
答案 1 :(得分:1)
试试这个
my $path = "ka/";
find($path);
sub find{
my ($s) = @_;
foreach my $ma (glob "\Q$s\E/*")
{
if(-f $ma && $ma =~ m/\.html\z/)
{
system('perl', '-i', '-pe', 's/tevision/ev/', '--', $ma);
}
elsif(-d $ma)
{
find($ma)
}
}
}