我需要递归重命名每个文件和目录.我将空格转换为下划线,并将所有文件/目录名称设置为小写.如何使以下脚本在一次运行中重命名所有文件?目前,在转换所有文件/目录之前,需要多次运行脚本.代码如下:
#!/usr/bin/perl
use File::Find;
$input_file_dir = $ARGV[0];
sub process_file {
$clean_name=lc($_);
$clean_name=~s/\s/_/g;
rename($_,$clean_name);
print "file/dir name: $clean_name\n";
}
find(\&process_file, $input_file_dir);
Run Code Online (Sandbox Code Playgroud)
您需要bydepth => 1在传递给 find 或 call 的选项中指定finddepth。从perldoc File::Find:
bydepth仅在报告了目录的所有条目后才报告目录名称。入口点是在 的第一个参数中
finddepth()指定的快捷方式。{ bydepth => 1 }find()
但是,您仍然需要决定如何处理命名冲突,因为如果目标存在,则重命名会破坏目标。
#!/usr/bin/perl
use strict; use warnings;
use File::Find;
finddepth(\&process_file, $_) for @ARGV;
Run Code Online (Sandbox Code Playgroud)