這行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為什麼還是當前路徑?