2009-12-23 110 views
3

我運行一個Perl腳本,並嘗試完成如下重命名文件重命名文件的循環..如何在在Perl

我與其他非文件夾中的* .ru.jp文件列表相關文件。我想用我得到的一個數字作爲計數變量進行重命名。

在bash,我會做的......

for i in $(ls *.ru.jp); do x=${i%%.*}; mv $i "$x"t"$counter".ru.jp ;done 

如myfile.ru.jp將被更名爲myfilet1.ru.jp如果計數器1的「T」只是一個命名到指示t1,t2 ...等。首先是一個外部循環,隨着計數器變量的增加,最終會標記mafilet2.ru.jp等等。

我想知道如何編寫和表示類似於Perl腳本中的循環?

謝謝。

-joey

回答

7

你可以使用Perl的文件名匹配和內置rename功能如下:

use warnings; 
use strict; 

my $i = 1; 
for (<*.ru.jp>) { 
    my $file = $_; 
    s/\.ru\.jp$//; 
    my $new = $_ . 't'. $i . '.ru.jp'; 
    rename $file, $new or die "Can not rename $file as $new: $!"; 
    $i++; 
} 
8
perl -e 'for $old (@ARGV) { 
      ++$counter; 
      if (($new=$old) =~ s/(\.ru\.jp)\z/t$counter$1/) { 
      rename $old => $new or warn "$0: rename: $!\n"; 
      } 
     }' *.ru.jp 
+6

我還挺喜歡你用胖逗號(=>)在這裏顯示舊文件成爲新的:) – toolic 2009-12-23 13:49:01

+4

並認爲人們說Perl代碼是不可讀的! – 2009-12-23 13:56:39

+0

當然,當你編寫'push $ element => @ list'時會發生什麼。糟糕,錯了。用逗號小心一點。 – jrockway 2009-12-24 05:31:59

1

我嘗試這樣做,似乎做的工作:

#! /usr/bin/perl 

my $count = 0; 
for (<*.ru.jp>) 
{ 
     $count++; 
     /(.+)\.ru\.jp/; 
     rename $_, $1 . "t" . $count . ".ru.jp"; 
} 
+3

絕對不要使用捕獲變量('$ 1','$ 2'等)!比賽結束後,使用'&&'代替分號。是的,我意識到這似乎在這個特定的背景下挑剔,但發展這種習慣會使你免於追逐棘手的錯誤。 – 2009-12-23 14:05:24

+0

感謝您的建議:)所以,你寧願看到這樣的東西?: /(.+)\.ru\.jp/ &&重命名$ _,$ 1。 「t」。 $ count。 「.ru.jp」; – Grimmy 2009-12-23 14:30:49

+0

是的,或者可能會強調重命名:'rename ... if /(。+)\。ru \ .jp /'。兩者都忽略'rename'返回的值,所以任何失敗都將會危險地沉默。你可以編寫'/.../&&(重命名... ||警告...);',但這看起來有點可愛。另一個重要的開發習慣是檢查系統調用的返回值,例如'rename','open','unlink'等。甚至'print'和'close'都會失敗,所以在寫入重要位時檢查它們。 – 2009-12-24 12:17:10

1
$count = 1; 
for (<*.ru.jp>) 
{ 
     ($filename)=(/^(.*?)\.ru.jp$/); 
     rename $_,$filename."t".$count++.".ru.jp"; 
} 
1
use strict; 
my $c=0; 
rename("$1.ru.jp", "$1" . $c++ . ".ru.jp") while <*.ru.jp> =~ /(.+).ru.jp/; 
+0

好用嚴格;也會使用警告。 – 2009-12-23 16:46:16

1
my $counter=0; 
while(my $file=<*.ru.jp>){ 
    $counter++; 
    my ($front,$back) = split /\./,$file,2; 
    $newname="$front$counter".".t."."$back\n"; 
    rename $file $newname; 
} 
+0

建議:我的$ counter ++ – 2009-12-23 16:48:07