2014年7月15日 星期二

在 Windows Command Line 環境下對多文件作批次尋找取代

最近想把舊照片的檔名,全都依EXIF改成時間日期格式,跟近幾年的統一。但以前用Picasa整理過的紀錄檔不會跟著自己改,於是必須找一個批次取代「.picasa.ini」文件內舊檔名的方法。

找到幾個方案:
  • findstr 指令,可惜只能尋找,不能取代。
  • PowerShell,功能多元強大,Windows 7 以上已有內建,但需要學習。依照自己之前經驗,若要大量重複執行,Scripts要寫得好,效率才不會太差。
  • [BatchSubstitute.bat],還有加強版 [Improved BatchSubstitute.bat],使用內建指令組成,可以取代部份特殊字,但是似乎不能取代原檔需匯成新檔。
  • FART,「Find And Replace Text 」的縮寫,是一個指令執行檔,簡單快速,缺點是跟許多以perl開發的軟體一樣,對Unicode相容性不佳,中文路徑可以找得到,但是文件中若有中文字串有時會無法取代。
  • sed,「Streams EDitor」的縮寫,不錯用,最後以此方案解決問題。預設隱藏屬性的檔案不修改,所以我把所有舊的「Picasa.ini」改成「.picasa.ini」,並全部取消隱藏。

我的方法是用DIR列出所有檔案,放到Excel 整理比對後生成指令。

照片檔以Jhead改名「jhead -n%Y%m%d%H%M%S-%f -a D:\路徑\照片.jpg」(同時保留原名)。

影像檔則以wmic找出最後修改時間(年月日時分秒,DIR只有到分),指令為「 wmic datafile where name=''D:\\影像檔路徑\\檔名" get Name, LastModified>>D:\匯出清單檔.txt」,確認最後修改日期時間無誤後,以REN改檔名。

最後生成SED字串指令,以「sed -i "s/舊字串/新字串/gI" D:\路徑\.picasa.ini」執行修改。

記錄一下。


事後補記

SED在遇到被搜尋檔案中有中文時,有時會卡住,幸好找到解決方案GSAR可以順利處理
使用「GSAR -s"舊字串" -r"新字串" -o "D:\路徑\.picasa.ini"」指令執行修改。

沒有留言:

張貼留言