2011-12-26 4 views
-4

問題は以下の通りであるこれらのディレクトリの各ディレクトリのセットとファイルの名前を変更します。各サブディレクトリにはテキストファイルがあります。はPerlコードが開発されるべき

ルートディレクトリの各ディレクトリに移動し、最初にそのディレクトリ内のファイルの名前を変更する必要があります。次に、元のディレクトリに戻って、ディレクトリ名を、それに含まれるテキストファイルと同じ名前に置き換える必要があります。

ステップ:

  1. 各ディレクトリを開き、ディレクトリ内のテキストファイルの名前を変更する1つ上のレベルに行くと、テキストファイルと同じ名前のディレクトリ自体の名前を変更
  2. を開いたことは
  3. が含まれています
  4. ルートディレクトリの次のディレクトリに移動
+1

tel私の操作ではループですべてのテキストファイルに同じ名前が付けられますか?あなたの新しい名前は何ですか? – run

答えて

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

+0

alrit .. '" \/"'はディレクトリに '/'を追加します。絶対ファイル名を作成するときには、ディレクトリに ''/''を続けて、ファイル名 を追加する必要があります。' dirname($ instance) 'は'/xyz/abc'を返します。 、ファイル名は 'file.txt' 完全なファイルは '/ xyz/abc/file.txt'となります。 もし'/xyz/abcfile.txt'が正しくない場合は追加しません。 – run

+0

あなたはスラッシュをエスケープするべきではありません。あなたがそれをやっているように変数を引用してください。 – tchrist

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

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); 
関連する問題