2012-11-16 52 views
2

我應該遍歷整個文件夾樹並將所有文件(包括文件夾)都重命名爲小寫。我環顧四周,發現最好的方法是使用File::Find。我測試了這個代碼:在File :: Find文件夾遍歷中重命名項目

#!/usr/bin/perl -w 

use File::Find; 
use strict; 

print "Folder: "; 
chomp(my $dir = <STDIN>); 

find(\&lowerCase, $dir); 

sub lowerCase{ 
    print $_," = ",lc($_),"\n"; 
    rename $_, lc($_); 
} 

它似乎工作正常。但任何人都可以告訴我,如果我可能遇到此代碼的麻煩?我記得有關如何在文件之前重命名文件夾或類似文件時遇到麻煩的文章。

+2

如果小寫版本已經存在,您將覆蓋它。 – jordanm

+2

@jordanm - 好的電話。也許'重命名$ _,lc($ _),除非-e $ _' – Kenosis

+0

啊,好的...謝謝一堆! – imakeitrayne

回答

2
  1. 如果你是在Windows,如評論所說,那麼沒有以任何順序重命名文件或文件夾將不會是一個問題,因爲路徑DIR1/file1相同dir1/file1到Windows。

    雖然在Unix上可能會出現問題,在這種情況下,最好是手動執行遞歸BFS。

  2. 此外,在做系統調用像重命名,經常檢查結果:

    rename($from, $to) || die "Error renaming $from to $to: $!"; 
    
  3. 正如在評論中指出,照顧有關重命名 「ABC」 爲 「ABC」。在Windows上不是問題。

+0

感謝您的幫助,我在Linux服務器上運行它,事實上我遇到了一個問題,程序無法找到根文件夾,因爲文件夾名稱已被更改...但我讀了更多,發現「finddepth(\\ wanted,@directories);」在後序遍歷而不是預序中執行相同的工作,這解決了問題... – imakeitrayne

0

就個人而言,我更喜歡:

  1. 列出文件手動使用find dir/ > 2b_renamed
  2. 評論列表,使用選擇的編輯器被重新命名(vim 2b_renamed,在我的情況)
  3. 使用該列表上的rename from CPANxargs rename 'y/A-Z/a-z/' < 2b_renamed

即使我可以輕鬆地回滾更改(通過git甚至Time Machine),對我來說也是非常重要的。