2012-05-20 80 views
1
#!/usr/bin/perl -w 

use strict; 
use File::Copy; 
use File::Spec; 

my($chptr, $base_path, $new, $dir); 

$dir = "Full Metal Alchemist"; #Some dir 

opendir(FMA, $dir) or die "Can't open FMA dir"; 
while($chptr = readdir FMA){ 
$base_path = File::Spec->rel2abs($dir).'/'; #find absolute path of $fir 
if($chptr =~ m(Chapter\w*\d*)){ #some regex to avoid the .. and . dirs 
    $new = join(" 0", split(/\W/, $chptr)); #modify said sub directory 
    rename "$base_path$chptr", "$base_path$new" ? print "Renames $base_path$chptr to 
    $base_path$new\n" : die "rename failed $!"; 
    } 
} 
closedir FMA; 

最初,我的腳本只使用相對路徑來執行move操作,但由於某些原因,這會使子目錄不受影響。我的下一步是去絕對路徑,但無濟於事。我只是在學習Perl,所以我覺得我犯了一個簡單的錯誤。我哪裏錯了? TIA在Perl中重命名子目錄

+0

你想避免什麼問題? – aleroot

+0

目前,我從重命名聲明中得到誤判。我想重命名子目錄。我唯一避免的是試圖重命名核心。和..鏈接 –

回答

1

您可以排除...如下:

if ($child ne '.' and $child ne '..') { ... } 

一些一般性意見:

  • 始終有你想要做什麼非常明確的規範。這也有助於所有人試圖幫助你。
  • 不清楚這裏出了什麼問題。也許你的正則表達式與你想要匹配的目錄不匹配?問題是什麼?
  • 嘗試將非常特定的部分(如要開始處理的目錄的名稱)製作爲參數。顯然,一些細節很難做成參數,比如什麼以及如何重命名。
  • 使用opendir,readdir,renameFile::Spec適合啓動。但有一個更簡單的方法:看看Path::Class module,特別是它的兩個子類。它們通過File::Spec(以及更多)提供精心設計的抽象層,它基本上是文件系統操作的一站式服務。
+0

謝謝,我的正則表達式工作正常,它只是重命名操作不起作用。我會研究使用Path :: Class。我只是困惑爲什麼重命名實際上不重命名目錄。 –

+0

'File :: Spec-> no_upwards()'更好,你知道;) – gaussblurinc