Você pode usar este comando para fazer backup de todos os seus arquivos de ponto ( .<something>
) no diretório $HOME
:
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
regex usando apenas tar?
método # 1
Eu pesquisei bastante isso e cheguei vazio. O fator limitante seria que quando o tar
está executando, é excluído, a barra final ( /
) que aparece com os diretórios não faz parte da equação quando o tar está executando sua correspondência de padrões.
Veja um exemplo:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory
Esta variante inclui uma exclusão de .*/
e você pode ver com a chave verbose ativada para tar, -v
, que esses diretórios estão passando por essa exclusão.
método # 2
Pensei que talvez as opções --no-wildcards-match-slash
ou --wildcards-match-slash
relaxassem a ganância do .*/
, mas isso também não teve efeito.
Tirando a barra da exclusão, .*
não era uma opção, já que isso diria a tar
para excluir todos os dotfiles e dotdirectories:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$
método # 3 (Feio!)
Portanto, a única alternativa que posso conceber é fornecer uma lista de arquivos para tar
. Algo parecido com isto:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory
Esta abordagem tem problemas se o número de arquivos exceder a quantidade máxima de espaço para transmitir argumentos para um comando seria um problema evidente. A outra é que é feia e excessivamente complexa.
então o que aprendemos?
Parece não haver uma maneira simples e elegante de realizar isso usando tar
& expressões regulares. De modo a comentar @Terdon, find ... | tar ...
é realmente a maneira mais apropriada de fazer isso.