开发perl代码的问题如下:
根目录中包含多个目录。每个子目录中都包含一个文本文件。
我们需要进入根目录的每个目录,然后首先重命名该目录中的文件。然后我们需要返回或者一个目录,并用与它包含的文本文件相同的名称替换目录名。
步骤:
答案 0 :(得分:2)
您可以使用File::Find模块,它以递归方式遍历目录树。模块中的finddepth()
函数可用于此目的,它从目录树的底部开始执行后序遍历起来。
use File::Find;
my $DirName = 'path_of_dir' ;
sub rename_subdir
{
#The path of the file/dir being visited.
my $orignm = $File::Find::name;
my $newnm = $orignm . '_rename';
print "Renaming $orignm to $newnm\n";
rename ($orignm, $newnm);
}
#For each file and sub directory in $Dirname, 'finddepth' calls
#the 'rename_subdir' subroutine recursively.
finddepth (\&rename_subdir, $DirName);
答案 1 :(得分:0)
您好我正在尝试概述您的想法
#!/usr/bin/perl
use strict;
use File::Find;
use Data::Dumper;
use File::Basename;
my $path = 'your root directory';
my @instance_list;
find (sub { my $str = $_;
if($str =~ m/.txt$/g) {
push @instance_list, $File::Find::name if (-e $File::Find::name);
}
}, $path);
print Dumper(@instance_list);
for my $instance (@instance_list) {
my $newname = 'newEntry';
my $filename = basename( $instance );
#rename the file 1st,
my $newFileName = dirname( $instance ) .'/'. $filename.$newname.'.txt'
;
rename($instance, $newFileName) or die $!;
#rename the directory
my $newDirName = dirname(dirname( $instance ) ).'/'. $newname;
rename(dirname($instance), $newDirName) or die $!;
}
答案 2 :(得分:0)
您尚未提及如何存储将用于重命名的文件名,因此我假设它是一种通用类型的更改,例如: “file_x” - > “file_x_foo”。你必须自己定义。
假设目录中唯一的常规文件是目标文件,此脚本将尝试重命名目录中的所有文件。如果目录中有更多文件,则需要提供识别该文件的方法。
该脚本采用可选参数,即根目录。
这是示例代码,未经测试,但应该可以使用。
use strict;
use warnings;
use autodie;
use File::Copy;
my $rootdir = shift || "/rootdir";
opendir my $dh, $rootdir;
chdir $rootdir;
my @dirlist = grep -d, readdir $dh;
for my $dir (@dirlist) {
next if $dir =~ /^\.\.?$/;
chdir $dir;
for my $org (grep -f, glob "*.txt") { # identify target file
my $new = $org;
$new .= "_foo"; # change file name, edit here!
move $org, $new;
}
chdir "..";
move $dir, $new;
}