Shell中處理帶有空格的檔案名稱的小trick 晚上終於把論壇上那個16本Python書的文章裡的書下載完了,發現有好幾本書名前都有一個 [搬書匠#123] 這樣格式的首碼,而且有幾個文檔還莫名其妙的有運行許可權,於是我決定寫個指令碼清理一下,其實是套用一下之前的一個指令碼(把1.abc.mp3改成01.mp3以自動排序): #!/bin/sh# # Description:# if there is a file with name: [1-9].xxx, it will be changed into 0[1-9].xxx for var in `ls`;do new=`echo $var | sed "s/^\([1-9]\)\./0\1\./g"` if [ $var != $new ];then mv $var $new fidone 之前這個指令碼運行很正常,我打算直接把 sed 後面的Regex改一改就搞定,結果改了之後刷出來一堆錯誤資訊,說 Can't stat file "xxx", 而 xxx 檔案只是正確檔案名稱中的一段,我如夢初醒,原來是檔案名稱中有空格,ls 返回的 list 被 for 錯誤地逐詞識別了,這下囧了,源檔案空格滿滿的啊,難怪 Unix Haters' Handbook 把檔案名稱中有空格的問題批得一無是處。 經過一番 google 總算是找到了答案,一個很巧妙的手法,只是把第六行改成了: ls * | while read var. 這其中的道理學過 Shell 的都看得懂,可是想出來可就不容易了。於是興沖沖地重寫了這個指令碼,結果如下: #!/bin/sh ls * | while read vardo if [ -x "$var" ]; then chmod a-x "$var" fi new=`echo "$var" | sed "s/^\[搬書匠[#0-9]*\]\(.*\)$/\1/g"` if [ $var != $new ];then mv "$var" "$new" fidone注意這裡的變數調用的時候,一定要寫為 "$var",如果手一抖寫成 $var 就又是一大堆看起來莫名其妙的錯誤資訊了。上面這個指令碼運行一切正常。 整個處理過程出現了多次詭異的故障,以至於事實上用的時間比手動修改長多了,不過喜愛編程的同道們都明白,這樣的一番折騰實在是一種娛樂,比起一個個改檔案名稱好玩的多。