&> src.txt find /repo/$USER/ -name "*.h" &>&> src.txt find /repo/$USER/ -name "*.xml" &>&> src.txt tar -zcvf src..." />

這行shell命令改如何優化?

find /repo/$USER/ -name "*.c" &>&> src.txt
find /repo/$USER/ -name "*.h" &>&> src.txt
find /repo/$USER/ -name "*.xml" &>&> src.txt
tar -zcvf src.gz `cat src.txt`

打包路徑下的所有.c.h.xml文件並保持文件路徑結構。

感覺不是很精簡。


find命令里的-name *.c這樣的條件參數是可以用-and, -or, -not等邏輯運算操作符連接起來的。所以前面三句可以合併成一條命令:

find /repo/$USER/ -name *.c -or -name *.h -or -name *.xml

這個例子里的雙引號是可以省略掉的,可以少打6個字元。當然,加上引號是更好的習慣,尤其是寫在腳本里的時候。

tar命令有個參數-T可以指定一個文件,從中獲取文件列表:

tar -zcvf src.gz -T src.txt

zcvf前面的-是可以省略的,可以少打1個字元。-T後面接文件,文件也可以是stdout,所以可以通過管道讀取上一個命令輸出到stdout中的內容,stdout在命令里用"-"表示。兩個命令可以精簡合併成一行:

find /repo/$USER/ -name *.c -or -name *.h -or -name *.xml | tar zcvf src.gz -T -

因為find命令還有個參數-regex支持正則表達式,所以還可以進一步精簡。但可讀性就變差了,而且寫出一個正確的正則表達式通常也不容易,看情況選擇性使用吧。

find /repo/$USER/ -regex .*.(c|h|xml) | tar zcvf src.gz -T -


find . -regextype egrep -regex .*.c|.*.h|.*.xml | xargs -r tar cvzf src.tar.gz


推薦閱讀:

Terminal中用Excel打開特定文件
如何評價 Windows 版「bash」(及其相關 *nix 子系統)?
在Bash中按Ctrl-S為什麼會失去響應?
Bash的「|」到底有什麼用,cd..|pwd為什麼還是當前路徑?

TAG:Linux開發 | Bash | Linux運維 | Shell編程 |