
Digamos que eu queira executar vários comandos com sinalizadores semelhantes, como:
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
Quero reutilizar a sequência de --exclude
sinalizadores e tornar o código mais limpo, por exemplo, salvando esses sinalizadores em uma variável.
Então, depois os comandos acima se parecem
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
Observe que isso tar
exclui arquivos e diretórios relativos ao diretório fornecido.
Qual é a solução melhor e mais limpa?
Fundo
Quero fazer backup do meu sistema usando tar e excluir alguns diretórios que não preciso.
Responder1
Você pode tentar isso:
$ 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
Aqui usamos bash
a expansão do histórico:
!!
consulte o último comando3-$
consulte o 3º parâmetro até o último
Você deve ativar bash
os recursos de expansão do histórico em seu script, que estão desabilitados no shell não interativo:
set -o history
set -o histexpand
Responder2
No Bash, uma maneira muito limpa é usar arrays:
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
Eles podem lidar com espaços e quaisquer outros personagens engraçados:
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
Eles também podem ser falsificados, por exemplo, você deseja excluir todos os subdiretórios de directory /this/one
que contenham a letra g
:
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
Responder3
Eu teria adicionado isso como um comentário, exceto que não descobri como formatar bem os comentários!
De qualquer forma, acredito que você já percorreu 90% do caminho. Tentar:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
Aspas são necessárias na primeira linha, pois há espaços envolvidos.
Sem aspas ao usar a variável para que ela divida os argumentos em espaços.
Se houver espaços nos nomes dos diretórios excluídos, você precisará escapar deles.