承襲上次試用iTunes不慎失誤所造成的慘痛代價 ,我被賦予的任務就是要將所有被自動更改位置並且被更動檔名的所有檔案都修改回來。但....三千多個檔案可不是個小數目,不是我說想改回來就改回來的,至少....不能叫我坐在電腦前面一整天只為了整理這堆音樂檔案吧?

  於是,如何在短時間內把檔案修改完成的計畫,就悄悄的在我的電腦上運作著...

  所謂『工欲善其事,必先利其器』,要把檔案改回來,首先當然要知道哪些檔案已經被更動了。根據當時iTunes的設定值來看,我在G:MP3裡面的所有檔案,只要是副檔名為MP3的檔案,全部都經由iTunes的整理而變的非常規則,換句話說,我們只要找出所有副檔名為MP3的檔案,就可以確定到底要動到哪些檔案了。

  但是,我所使用的Windows既沒有在UNIX上可以使用的 find 工具,內建的搜尋功能又破腳到不行,要怎樣才能快速且精確的取得所有修改的檔案呢?於是,我便利用了 Perl 著手寫出下面的Perl Script 來幫助我取得這些被更改過的檔案清單:

#!/usr/bin/perl
print " ";
$ext_path="./";
open (FIL, ">>123.txt") or die "Cannot open save file! ";
&get_filelist($ext_path, "");
close FIL;
#print "@dir";
sleep 3;
exit;











  而這個Script最精華的部分,就在於下面的 get_filelist() 副常式:

sub get_filelist {
 my ($dir);
 my (@filelist, @dir);
 my ($entry, $type, $man, $exr, $ext, $drop);
 opendir (DIR, "$_[0]") or die "Cannot open $_[0]! ";
 
 foreach (readdir DIR) {
  next if (($_ eq ".")||($_ eq ".."));
  $type = -d "$_" ? "dir" : "file";

  if ($type eq "file") {
   print "File: $_[1]$_"." ";
   print FIL "File: $_[1]$_"." ";
  } elsif ($type eq "dir") {
   print "Dir : $_[1]$_"." ";
   print FIL "Dir : $_[1]$_"." ";
   chdir "$_" or die "Cannot change directory to $_:$!";
   print "*** Change current DIR to $_[1]$_ ***"." ";
   print FIL "*** Change current DIR to $_[1]$_ ***"." ";
   get_filelist("./", "$_[1]$_");
   chdir ".." or die "Cannot change directory to $_:$!";
   print "*** Change current DIR to $_[1] ***"." ";
   print FIL "*** Change current DIR to $_[1] ***"." ";
  }
  
 }

 closedir (DIR);
 return @filelist;
}

































  在一開始的前5行,只是很簡單的宣告變數,以及一個開資料夾的步驟而已。接下來,讀取資料夾中的所有檔案,並且利用正規表示式過濾掉開頭為 . 或  .. 的檔案,然後在順便確定一下讀到的東西是檔案還是目錄,如果是檔案的話就將檔案名稱連同路徑一起儲存到 123.txt 當中;若是目錄的話則使用遞迴呼叫移至該目錄底下並且繼續讀取檔案。

  不一會兒〈好吧!嚴格說來是大約過了十秒鐘之後〉,所有變動的檔案都連著它們的路徑乖乖的儲存在 123.txt 當中啦!或許各位看倌會覺得奇怪,取得檔案目錄有哪些好處?嘿嘿!它可幫了我不少大忙,稍後會介紹另一個神奇的 Script ,它將會以驚人的速度來完成這個艱鉅的任務,請大家拭目以待嚕!
arrow
arrow
    全站熱搜

    stevennick 發表在 痞客邦 留言(0) 人氣()