2011-06-28 34 views
0

我正在尋找一種方法來統計和編號/重命名目錄中的文件與1-9的前導零。它必須基於File :: find,儘管它可能不是最有效的方式,但後來我必須將它集成到更大的代碼中,該代碼基於該函數,並且很難重寫。 'File1','File2','File3'...'File10','File11'等成爲'01。 File1','02。 File2',... '10。 File10','11。 FILE11' 等在一個目錄中的Perl計數和數字文件

use strict; 
use warnings; 
use File::Find; 

find(\&rename_files, $dir_source); 
sub rename_files { 
    /\.flac$/ or return; 
    my $fd = $File::Find::dir; 
    my $fn = $File::Find::name; 
    my $file = $_; 


    rename $file, $_;  
} 

UPDATE:這與代碼開始計數從0文件一個例外的工作方案,雖然$ count設置爲1。

use strict; 
use warnings; 
use File::Find; 

my $dir_source = ''; 

find(\&rename_files, $dir_source); 
{ 
    my $count = 1; 
    sub rename_files { 
     return if not -f $_ or not /\.flac$/;    
     my $file = sprintf "%02d\. $_", $count++; 
     print "$file\n"; 
     rename $_, $file; 
    } 
} 
+0

閱讀該文檔在它看來所有你所要做的就是打電話找到想要的子程序試圖匹配' $ _ =〜/^\ d \ D /',如果是這樣的話,用名稱附加0來重命名文件。哦,並增加一些計數變量來計數它們。 – NorthGuard

+0

如果找到的文件在開始時缺少2位數 - 從1到9/01,02,03,... 10,11 etc /中的前導0進行計數和重命名。 – thebourneid

+0

@thebourneid你能否更新你的問題,這不是很清楚你想要什麼?看起來你有兩種情況,一種是在開始時沒有數字,另一種是在開始時只有一個數字的情況。添加一些您會看到的示例文件,以及您希望將它們更改爲什麼樣的文件會更好。例如'1filename.txt => 01filename.txt'和'11filename.txt => 11filename.txt' – NorthGuard

回答

2

你可能有根據您的具體需求調整它,但我認爲它應該指向正確的方向。順便說一下,我建議在測試/調試階段將「rename $_, $file」行替換爲「print "rename $_, $file\n";」,以便您可以看到啓用後會執行的操作,而不是在完成操作後執行錯誤。 ;)

這裏的片段:

use strict; 
use warnings; 
use File::Find; 

find(\&rename_files, $dir_source); 

{ 
    my $count = 0; 
    sub rename_files { 
     return if not /\.flac$/; 
     my $file = $_; 
     return if not -f $file; 
     $file =~ s/^([^\d]{2})(?=\.)/sprintf "%2d$1", $count++/e; 
     rename $_, $file; 
    } 
} 

它採用了約$計數封給你分一個計數器,並在您置換RE A/E選項來執行的sprintf,而不是僅僅用替換文字字符串。順便說一下,你已經有95%的存在與File :: Find,但對於未來,也許不那麼瑣碎的任務,我真的很喜歡File :: Find :: Rule的乾淨的接口。你可以看看它,看看它可能是未來更好的工具。

更新:由於更新到你原來的問題,如下我將修改代碼:

use strict; 
use warnings; 
use File::Find; 

find(\&rename_files, $dir_source); 

{ 
    my $count = 0; 
    sub rename_files { 
     return if not -f $_ or not /\.flac$/;    
     my $file = sprintf "%2d$_", ++$count; 
     rename $_, $file; 
    } 
} 
+0

謝謝DavidO。這些是您的建議中的兩行代碼,經過一些測試後,它幾乎可以爲我工作:$ file =〜s/^([^ \ d \ d \。\ s。*)$/sprintf「%02d \」。 $ 1「,$ count ++/e; $ file = sprintf「%02d \。$ _」,$ count ++;我唯一不知道的是如何從1而不是從0計數文件。 – thebourneid

+0

將'my $ count = 0;'更改爲'my $ count = 1;'這就是我們設置起始數字的地方。 – DavidO

+0

這是我做的第一件事,但代碼仍然從零開始計數,並將第一個文件重命名爲'00'而不是'01'。 – thebourneid

相關問題