2011-07-21 75 views
1
mv $1 $(echo $1 | sed s:\ :_:g) 

這是一個簡單的腳本,重命名作爲參數傳遞的文件,將空格交換爲下劃線。然而,當我嘗試將文件「AEI」重命名爲「a_e_i」爲例,它返回以下錯誤:簡單的bash腳本來改變文件名下劃線的空格

./spc2und a\ e\ i 
mv: target `a_e_i' is not a directory 

回答

7

您需要周圍的變量和命令替換雙引號,以防止空間從文件名被誤認爲論證分隔符。另外,你不需要sed,因爲bash可以自己進行字符替換:

mv "$1" "${1// /_}" 

編輯:發生了幾件事。首先,如果已經有一個帶下劃線的文件(「a_e_i」或其他),你應該使用mv -i。其次,這隻適用於簡單的文件名 - 如果你在封閉目錄中給它一個帶有空格的文件路徑(例如「foo bar/baz quux/aei」),它會嘗試將它重命名爲一個空格轉換的目錄,這並不存在,導致喜劇。所以這裏有一個建議更好的版本:

​​

BTW,其他的答案離開關上文件名的雙引號用下劃線代替空格之後 - 這不是完全安全的,因爲有其他奇怪的字符可能仍然造成麻煩。規則1:如有疑問,請將其用雙引號包裝以確保安全。規則2:有疑問。

2

你的$ 1擴展到E I,然後將其作爲前三個參數的MV,讓您的來電變得

mv a e i a_e_i 

這是你的錯誤消息的原因。 爲了解決這個問題,所有你需要做的就是報價$ 1:

mv "$1" $(echo "$1" | sed s:\ :_:g) 
5

試試這個 - 純慶典:

mv "$1" ${1// /_}