for循环批量写文件 shell_shell脚本:for循环批量重命名带空格文件名的文件
今天在學習shell腳本攻略第二章2.13 批量重命名和移動時,由于我的文件命令有的文件名字中出現空格,出現了許多問題,因此將解決問題的過程記錄了下來,希望能夠和大家交流學習,共同進步,謝謝!
問題代碼
問題代碼
最終成功代碼
最終代碼
步驟一
思路: 由于在shell中運行此腳本時,發現將找到的文件名按照空格分割開來,結果利用for循環時,每一個文件名被打散,例如'./Screenshot from 2017-09-22 14-43-51.png' 拆分成了'./Screenshot\ ' 'from' '2017-09-22'等,所以執行錯誤. 所以在解決該問題時的第一個思路就是將文件名正確的讀出來.
解決方案: 將
`find . -name "*.png" -o -name -maxdepth 1 -type f`
改為
`find . -name "*.png" -o -name -maxdepth 1 -type f -print`
原因: find -print 會將每一個查詢出來的文件通過換行符分割開
結果: 依然不行,但是在shell中直接輸入該命令,確實是換行輸出
步驟二
思路: 雖然輸出是換行輸出,但是是for循環在讀入的時候是從一個大字符串中進行分割,而分割的標識是IFS,IFS默認分隔符是空格\tab\換行,所以會將換行符和空格同樣對待,所以需要更改IFS的分割標志.
解決方案:添加代碼
OLDIFS=$IFS
IFS=$'\n'
IFS=$OLDIFS
注意: 這里將IFS的分割標志換成了 $'\n' 換行符,如果寫成'\n'僅僅表示字母n
結果: 每一次for循環能夠得到正確的文件名,但是在執行mv命令時依然報錯,原因是文件名中有空格,不能找到正確的文件
步驟三
思路: 在shell中直接執行mv命令,會把文件名中帶有空格的文件的文件名的空格進行轉譯,即將' '轉成'\ '.所以這一步的思路就是得到轉譯之后的文件名
解決方案:添加代碼
img=${img// /\\ }
結果: 可以將文件名正確的轉換成轉譯之后的文件名,**但是**依然不能正確運行,shell中提示的錯誤信息是
mv: cannot stat './Screenshot\ from\ 2017-09-22\ 14-43-51.png': No such file or directory
但是我直接用這個文件名進行mv命令操作是可以進行的,所以這個時候進行最后一步
步驟四
思路: 得到了正確的文件名,但是不能正確的執行mv操作,那么問題就在腳本的這個命令上
mv "$img" $new
所以我在mv前面加上了一個預處理的命令 eval
eval mv "$img" $new
mv命令在執行前會先執行eval命令,將變量的值轉換過來,然后在執行,最后得到了正確的結果
知識點
在完成整個文件批量重命名的過程中主要用到了一下幾個知識
1. find -print 和-print0
2. IFS 分隔符
3. 字符串替換的方法
4. eval命令
5. 以后命名的時候千萬不要在帶空格了,很麻煩
6. 因為這次執著于for循環解決,所以花了點時間,簡單的可以使用while read line
總結
以上是生活随笔為你收集整理的for循环批量写文件 shell_shell脚本:for循环批量重命名带空格文件名的文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编译器如何设置中文_如何使s
- 下一篇: 安川伺服总线通讯方式_MⅢ总线特点 安川