大括號擴展:cp和mv搭配{,}在shell作用

經常會在博客或者論壇看到類似下面的命令 大括號擴展  Brace expansion { }shell   作用

cp /etc/httpd/httpd.{,.bakup}

或者是

mv resume{z,}.doc

那麼,在uinx / linux shell命令中是什麼意思?起什麼作用呢?


{ } 並沒有什麼實際的含義,但是卻可以作爲Brace expansion(大括號擴展或叫做花括號擴展)而經常用於產生各種組個。以下是翻譯自 GNU/BASH  man page  的內容:

Brace expansion(大括號擴展或叫做花括號擴展) 是用來隨機產生字符串組合的機制。
這種機制類似於文件的擴展名,但是並不需要存在響應的文件。
Brace expansion(大括號擴展或叫做花括號擴展)模式是一可選的preamble(前導字符),
後面跟着一系列逗號分隔的字符串,包含在一對花括號中,
再後面是一個可選的postscript(打印編程語言)。
preamble(前導字符)被添加到花括號中的每個字符串前面,
postscript(打印編程語言)被附加到每個結果字符串之後,從左到右進行擴展。
花括號擴展可以嵌套。擴展字符串的結果沒有排序;而是保留了從左到右的順序。

 


1.如,在終端中輸入下面命令:

echo foo{1,2,3}.txt

輸出如下:

foo1.txt foo2.txt foo3.txt

2.也可以使用下面附加的實例,去在命令中“創建”一個參數,以節省輸入的時間,提高工作效率:

echo file.txt{,.bak}
echo file-{a..d}.txt
echo mkdir -p /apache-jail/{usr,bin,lib64,dev}
echo cp httpd.conf{,.backup}
echo mv delta.{txt,doc}

3.可以使用Brace expansion(大括號擴展或叫做花括號擴展)來複制,重命名文件,或者是備份文件,還可以是創建目錄等。在下面這個習慣性使用的的例子中,將file1.txt備份爲file2.txt.bak,輸入:

cp -v file1.txt file1.txt.bak

如果使用Brace expansion,節省時間,則輸入:

cp -v file1.txt{,.bak}

輸出如下:

file1.txt -> file1.txt.bak

更多大括號擴展實例如下:


4. 如果我們執行:

$ cp /etc/apt/sources.list /etc/apt/sources.list.bak

這兩個 /etc/apt/sources 部分相同,爲了少輸入兩次/etc/apt/sources ,大括號擴展參數。還有平時重命名,備份文件,創建鏈接時候,都可以使用大括號擴展參數的方法提高效率。


大括號擴展,即大括號包圍的,用逗號隔開的參數會擴展爲獨立的多個參數。

$ cp /etc/apt/sources.{list,list.bak}

Shell 在解釋時會自動將後面的參數擴展成兩個,就變成了和上面一樣的完整命令。


當然,還可更簡單,將list也考慮進去,在逗號前什麼都不寫,如下:

$ cp /etc/apt/sources.list{,.bak}

這樣逗號前面沒東西,那麼參數就保持原來的不變,逗號後面的照樣擴展。


英文原文:Explain: {,} in cp or mv Bash Shell Commands


參考:《shell 十三問? 》和《bash shell 大括號擴展 》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章