2013-05-02 66 views
1

我很難理解這一點。我已經研究了大括號擴展和mv命令,但由於某種原因,它對我仍然沒有意義。我讀的Unix和Linux系統管理手冊,並使用此作爲一個例子,但我不理解行:BASH將.log重命名爲.LOG

mv $fname ${fname/.log/.LOG}; 

我意識到它是移動當前$fname變量,它是與.LOG,但任何事情${fname/.log/.LOG};令我困惑。我以爲它基本上是mv源目的地...那麼爲什麼有2 /?如果有人能用簡單的英語向我解釋這一點,我會非常感激!

#!/bin/bash 

find . -type f -name '*.log' | grep -v .do-not-touch | while read fname; 
do 
mv $fname ${fname/.log/.LOG/}; 
done 
+1

閱讀有關bash參數模式擴展。這裏是一個很好的鏈接http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html – abasu 2013-05-02 08:24:41

+0

我將定位擴展名:'$ {fname /%.log/.LOG}'雖然我會寫:'mv「$ fname」「$ {fname%.log} .LOG」' – 2013-05-02 14:37:50

回答

3

mv線應該被解釋爲 「移動到$fname${fname/.log/.LOG}」。 ${var/pattern/string}結構是稱爲模式替換的參數擴展的一種形式。它返回該變量的值,該模式的第一次出現被字符串替換。換句話說,在這種情況下,它用.LOG代替.log。因此,對於每個文件,該行類似於

mv file.log file.LOG 
+0

謝謝!這個解釋清除了這個部分非常有用$ {var/pattern/string}我不知道這甚至是可能的。再次感謝! – Fr0ntSight 2013-05-02 22:46:23

1

正如您所說,$ fname包含以「.log」結尾的原始文件名。你看到的bash表達式說:取變量$ fname的內容,找到「.log」並用「.LOG」替換它。結果行將以「.log」結尾的文件移動到具有相同名稱的文件,但將「.log」替換爲「.LOG」。

您可能想看看http://tldp.org/LDP/abs/html/http://www.tldp.org/LDP/abs/abs-guide.pdf高級bash腳本指南。

+0

謝謝!我想我現在明白了。我將閱讀您發給我的那些鏈接......我感謝幫助和快速響應! – Fr0ntSight 2013-05-02 22:45:25