
假設我想執行多個具有類似標誌的命令,例如:
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
我想重複使用標誌序列--exclude
並使程式碼更乾淨,例如將這些標誌儲存到變數中。
所以之後上面的指令看起來像
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
請注意,tar
排除相對於給定目錄的檔案和目錄。
最好、最乾淨的解決方案是什麼?
背景
我想使用 tar 備份我的系統並排除一些我不需要的目錄。
答案1
你可以試試這個:
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
這裡我們使用bash
歷史擴充:
!!
參考最後一條指令3-$
參考第三個參數到最後一個
bash
您應該在腳本中開啟歷史擴充功能,該功能在非互動式 shell 中被停用:
set -o history
set -o histexpand
答案2
在 Bash 中,一個非常簡潔的方法是使用陣列:
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
他們可以處理空格和任何其他有趣的字元:
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
它們也可以被偽造,例如,您想要排除 目錄 中/this/one
包含字母的所有子目錄g
:
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
答案3
我本來會將此添加為評論,但我還沒有弄清楚如何很好地格式化評論!
無論如何,我相信你已經成功了 90%。嘗試:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
第一行需要引號,因為涉及空格。
使用變數時不加引號,以便在空格上分割參數。
如果排除的目錄名稱中有空格,您需要將其轉義。