2013-11-04 27 views
0

我試圖重命名文件夾中的所有tif文件並將它們從1編號爲x。防爆。初始文件名「image-2.tif」和「image-3.tif」將重命名爲「file1.tif」和「file2.tif」。在目錄中重命名和編號文件

這裏是我的代碼:

my $dirname = "../folder"; 
opendir (DIR, $dirname) or die "cannot open directory $dirname"; 
my @files = grep /.tif/, readdir DIR; 
closedir (DIR); 

my $basename = "file"; 
my $count = 1; 
my $new; 
foreach (@files) { 
$new = "${basename}${count}.tif"; 
print "rename $_ ${basename}${count}.tif\n"; 
rename $_, $new; 
$count++; 
} 

儘管所有的文件都正確地讀出,他們只是不改名。

+0

您是否檢查過您是否有權重命名這些文件?你的腳本對我來說是完美的 – Jean

+0

更改my $ dirname =「../folder」;到我的$ dirname =「../文件夾/」; – michael501

+3

正確的模式是'/ [。] tif \ z /' –

回答

0

我終於找到正是我一直在尋找。在Tim Peoples的迴應的幫助下。最簡單的迴應是:

my $dirname = "../folder"; 
opendir (DIR, $dirname) or die "cannot open directory $dirname"; 
my @files = grep /[.]tif\z/, readdir DIR; #corrected pattern based on Sinan Ünür's comment 
closedir (DIR); 

my $basename = "file"; 
my $count = 1; 
my $new; 
foreach (@files) { 
$new = "${basename}${count}.tif"; 
print "rename $_ $new\n"; 
rename ("$dirname/$_", "$dirname/$new") or warn "rename: $_: $new: $!\n"; #directory name  added to both the original file name and new file name. Thanks to Tim for helping me found this error using warn. 
$count++; 
} 
3

當您從另一個文件獲取文件時,您需要爲您的rename()函數使用一條好路徑。該模塊File::Spec可以幫助獲得它:

use File::Spec; 

my $dirname = "../folder"; 
my $abs_path = File::Spec->rel2abs($dirname); 

和:

foreach (@files) { 
    $new = "${basename}${count}.tif"; 
    print "rename $_ ${basename}${count}.tif\n"; 
    rename File::Spec->catfile($abs_path, $_), File::Spec->catfile($abs_path, $new); 
    $count++; 
} 
2

我建議改變你的線路:

rename $_, $new; 

...到更多的東西一樣:

rename($_, $new) or warn "rename: $_: $new: $!\n"; 

...和你應該能夠看到它爲什麼不起作用 - 因爲rename在失敗時返回false(並且$!會告訴你爲什麼失敗)。

此外,您rename操作的目標(在你的情況:$new)需要包括目錄部分,以及(否則,您試圖將文件移動到進程的當前工作目錄(你打算可能不算什麼)) 。

最後,我建議您不要將$dirname的值硬編碼爲相對路徑,而應該接受它作爲命令行參數。這允許您的腳本從任何$PWD運行。請參閱perlvar聯機幫助頁中的@ARGV和/或內置的shift命令。

因此,這樣的事情:

my $dirname = shift; # Accept dirname as commandline argument 
opendir (DIR, $dirname) or die "cannot open directory $dirname"; 
my @files = grep /\.tif$/, readdir DIR; # Escape regex meta-char (.) and anchor to end of string ($). 
closedir (DIR); 

my $basename = "file"; 
my $count = 1; 
my $new; 
foreach (@files) { 
    $new = "${dirname}/${basename}${count}.tif"; # Include dirname in target path 
    print "rename $_ $new\n"; 
    rename($_, $new) or warn "rename: $_: $new: $!\n"; #warn when rename fails 
    $count++; 
}