2011-12-26 62 views
-4

问题为其Perl代码是待开发的情况如下:重命名一组目录和文件中的每个这些目录

有一个包含了好目录根目录。每个子目录都有一个文本文件。

我们需要进入根目录的每个目录,并首先重命名该目录内的文件。然后,我们将需要返回,或上一个目录,并用与其包含的文本文件名称相同的名称替换目录名称。

步骤:

  1. 打开每个目录
  2. 重命名该目录中的文本文件打开
  3. 进入上一层,并为文本文件,其同名文件夹重命名本身含有
  4. 移动到根目录中的下一个目录
+1

打电话给我,当你在循环中操作时,你会为所有文本文件指定相同的名字吗?你的新名字是什么? – run 2011-12-26 06:38:13

回答

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 $!; 

} 
+0

魔鬼是什么?\/\“全是,呃? – tchrist 2011-12-28 13:56:22

+0

alrit ..'“\ /”'追加'/'目录。当u构建绝对文件名,我们需要添加'“/”'到目录,然后是文件名 例如:'目录名($实例)''返回/ XYZ/abc' 和文件名会'file.txt' 那么完整的文件将是'/ xyz/abc/file.txt' 如果你不添加'/它将会是'/ xyz/abcfile.txt'这是不正确的 – run 2011-12-29 04:22:36

+0

你不应该逃避斜杠,你不应该引用变量的方式,你这样做。 – tchrist 2011-12-29 05:20:19

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; 
} 
+0

downvoter照顾解释? – TLP 2011-12-26 15:58:04

2

可以使用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);