2009-01-02 138 views
3

我想把一個字符串(reference_)加到所有目錄中的所有* .bmp文件的名字以及子目錄中。我們第一次運行Silk腳本時,它將創建目錄以及子目錄,並且在每個子目錄下,它將存儲每個移動應用程序的sceenshot,其擴展名爲.bmp如何爲目錄下的所有文件名添加前綴?

當我第二次運行自動silkscript時,它將再次在所有子目錄中創建* .bmp文件。在第二次運行腳本之前,我希望以字符串reference_前綴所有* .bmp。

例如first_screen.bmpreference_first_screen.bmp, 我有如下的目錄結構:具有first_screen.bmpfirst_screen.bmp文件等...

可以在任何一個幫助我

C:\Image_Repository\BG_Images\second 
... 
C:\Image_Repository\BG_Images\sixth 

如何在reference_字符串前綴所有圖像文件名?

當我第二次運行該腳本時,silk中的Perl腳本將從子目錄中獲取兩個圖像並逐個像素地比較它們。我正在嘗試下面的代碼。 請你指導我如何着手完成這項任務。

#!/usr/bin/perl -w 
&one; 

&two; 

sub one { 

    use Cwd; 

    my $dir ="C:\\Image_Repository"; 
    #print "$dir\n"; 
    opendir(DIR,"+<$dir") or "die $!\n"; 
    my @dir = readdir DIR; 
    #[email protected]; 
    delete $dir[-1]; 
    print "$lines\n"; 
    foreach my $item (@dir) 
    { 
     print "$item\n"; 
    } 
    closedir DIR; 
} 

sub two { 

    use Cwd; 

    my $dir1 ="C:\\Image_Repository\\BG_Images"; 
    #print "$dir1\n"; 
    opendir(D,"+<$dir1") or "die $!\n"; 
    my @dire = readdir D; 
    #[email protected]; 
    delete $dire[-1]; 
    #print "$lines\n"; 
    foreach my $item (@dire) 
    { 
     #print "$item\n"; 
     $dir2="C:\\Image_Repository\\BG_Images\\$item"; 
     print $dir2; 
     opendir(D1,"+<$dir2") or die " $!\n"; 
     my @files=readdir D1; 
     #print "@files\n"; 
     foreach $one (@files) 
     { 
      $one="reference_".$one; 
      print "$one\n"; 
      #rename $one,Reference_.$one; 
     } 
    } 
    closedir DIR; 
} 

我試着用「+ <」模式打開電話,但我得到的編譯錯誤的讀取和寫入模式。 當我運行此代碼時,它顯示BG_images文件夾中帶有前綴字符串的文件,但實際上它不更新子目錄中的文件。

+0

我不明白你在這裏問什麼。您的文字說了一件事,但您的代碼顯示了其他內容。 – 2009-01-02 22:32:01

回答

3

你不打開目錄進行寫入。只需使用opendir沒有字符串的模式部分:

opendir my($dir), $dirname or die "Could not open $dirname: $!"; 

但是,你並不需要這一點。你可以使用File :: Find來創建你需要的文件列表。

 
#!/usr/bin/perl 
use strict; 
use warnings; 

use File::Basename; 
use File::Find; 
use File::Find::Closures qw(find_regular_files); 
use File::Spec::Functions qw(catfile); 


my($wanted, $reporter) = find_regular_files; 
find($wanted, $ARGV[0]); 


my $prefix = 'recursive_'; 


foreach my $file ($reporter->()) 
    { 
    my $basename = basename($file); 

    if(index($basename, $prefix) == 0) 
     { 
     print STDERR "$file already has '$prefix'! Skipping.\n"; 
     next; 
     } 

    my $new_path = catfile( 
     dirname( $file), 
     "recursive_$basename" 
     ); 

    unless(rename $file, $new_path) 
     { 
     print STDERR "Could not rename $file: $!\n"; 
     next; 
     } 

    print $file, "\n"; 
    } 
3

你應該看看File::Find這個模塊 - 它會使目錄樹上下遞歸更簡單。

您應該掃描文件名並修改那些不以reference_開頭的文件名,以便它們能夠執行。這可能需要將文件名分割成目錄名和文件名,然後在文件名部分前加reference_。這是通過File::Basename模塊完成的。

在某些時候,您需要決定第三次運行腳本時發生的情況。是否已經以reference_開頭的文件被覆蓋,或者前綴文件被覆蓋,或者是什麼?

文件未被重命名的原因是重命名操作被註釋掉。請記住在腳本頂部添加use strict;(以及您使用的-w選項)。

如果你的文件的一個數組@files列表(和名稱是基本名稱,所以你不必使用文件::基名擺弄),則循環可能看起來像:

foreach my $one (@files) 
    { 
     my $new = "reference_$one"; 
     print "$one --> $new\n"; 
     rename $one, $new or die "failed to rename $one to $new ($!)"; 
    } 
0

隨着find效用從coreutils for Windows援助:

$ find -iname "*.bmp" | perl -wlne"chomp; ($prefix, $basename) = split(m~\/([^/]+)$~, $_); rename($_, join(q(/), ($prefix, q(reference_).$basename))) or warn qq(failed to rename '$_': $!)" 
+0

爲什麼不能:find -iname'* .bmp'-exec mv'{}'reference _'{}'\; #?我不知道Perl,所以我不知道管道的第二端是什麼(我無法真正理解OP的問題,或者......)。 – strager 2009-01-03 01:12:18

相關問題