Reutilize sinalizadores semelhantes para vários comandos

Reutilize sinalizadores semelhantes para vários comandos

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 --excludesinalizadores 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 tarexclui 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 basha expansão do histórico:

  • !!consulte o último comando
  • 3-$consulte o 3º parâmetro até o último

Você deve ativar bashos 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/oneque 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.

informação relacionada