问题为其Perl代码是待开发的情况如下:重命名一组目录和文件中的每个这些目录
有一个包含了好目录根目录。每个子目录都有一个文本文件。
我们需要进入根目录的每个目录,并首先重命名该目录内的文件。然后,我们将需要返回,或上一个目录,并用与其包含的文本文件名称相同的名称替换目录名称。
步骤:
- 打开每个目录
- 重命名该目录中的文本文件打开
- 进入上一层,并为文本文件,其同名文件夹重命名本身含有
- 移动到根目录中的下一个目录
问题为其Perl代码是待开发的情况如下:重命名一组目录和文件中的每个这些目录
有一个包含了好目录根目录。每个子目录都有一个文本文件。
我们需要进入根目录的每个目录,并首先重命名该目录内的文件。然后,我们将需要返回,或上一个目录,并用与其包含的文本文件名称相同的名称替换目录名称。
步骤:
嗨,我正在尝试概述您的想法
#!/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 $!;
}
魔鬼是什么?\/\“全是,呃? – tchrist 2011-12-28 13:56:22
alrit ..'“\ /”'追加'/'目录。当u构建绝对文件名,我们需要添加'“/”'到目录,然后是文件名 例如:'目录名($实例)''返回/ XYZ/abc' 和文件名会'file.txt' 那么完整的文件将是'/ xyz/abc/file.txt' 如果你不添加'/它将会是'/ xyz/abcfile.txt'这是不正确的 – run 2011-12-29 04:22:36
你不应该逃避斜杠,你不应该引用变量的方式,你这样做。 – tchrist 2011-12-29 05:20:19
你没有提到如何存储将用于重命名文件名,所以我会假设它是一个通用型的变化,例如, “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;
}
downvoter照顾解释? – TLP 2011-12-26 15:58:04
可以使用File::Find模块,它遍历模块中的目录树recursively.The 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);
打电话给我,当你在循环中操作时,你会为所有文本文件指定相同的名字吗?你的新名字是什么? – run 2011-12-26 06:38:13