日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

for循环批量写文件 shell_shell脚本:for循环批量重命名带空格文件名的文件

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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循环批量重命名带空格文件名的文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。