Quero fazer backup de todos os 'dotfiles' (fe .zshrc
) no meu diretório inicial com tar , mas excluindo a estrutura de diretórios e todos os subdiretórios.
Eu tentei várias vezes com comandos diferentes, mas o melhor que consegui foi um arquivo que também incluía os diretórios ocultos $HOME
.
#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*
Também pensei em usar find
e canalizar o resultado para alcatrão, mas sem sorte. Alguém sabe como realizar essa tarefa - aparentemente fácil -?
PS: Na maioria das vezes, quando estou usando o tar para criar um arquivo, tenho que pensar no xkcd comic:
:)
*(.)
- e eu acho que exclui.
e..
de.*
por padrão (e que não iria ser pego por.*(.)
qualquer maneira, uma vez que seleciona apenas os arquivos). Eu não uso o zsh, então não tenho certeza o suficiente para transformar isso em uma resposta.Respostas:
Você pode usar este comando para fazer backup de todos os seus dotfiles (
.<something>
) no seu$HOME
diretório:regex usando apenas tar?
Método 1
Eu pesquisei bastante isso e vim vazio. O fator limitante seria que, ao
tar
executar suas exclusões, a barra final (/
) que aparece nos diretórios não faz parte da equação quando o tar está executando sua correspondência de padrões.Aqui está um exemplo:
Essa variante inclui uma exclusão de
.*/
e você pode ver, com a opção detalhada ativada para tar-v
, que esses diretórios estão passando por essa exclusão.método # 2
Eu pensei que talvez os interruptores
--no-wildcards-match-slash
ou--wildcards-match-slash
relaxassem a ganância do.*/
mas isso também não teve efeito.Tirar a barra da exclusão,
.*
também não era uma opção, pois isso diriatar
para excluir todos os arquivos de ponto e diretórios de ponto:método # 3 (Feio!)
Portanto, a única outra alternativa que posso conceber é fornecer uma lista de arquivos
tar
. Algo assim:Essa abordagem tem problemas se o número de arquivos exceder a quantidade máxima de espaço para a passagem de argumentos para um comando seria um problema flagrante. A outra é que é feia e excessivamente complexa.
então o que aprendemos?
Não parece haver uma maneira direta e elegante de realizar isso usando
tar
expressões regulares. Portanto, quanto ao comentário de @ terdon,find ... | tar ...
é realmente a maneira mais apropriada de fazer isso.fonte
regex
, mas eu deveria ter sabido que ele não vai funcionar dessa maneira :)regex
você provavelmente precisará escapar do ponto inicial e terá problemas para ignorar.
e..
. Estou certo de que é possível, como o slm provavelmente demonstrará, mas não vejo por que valeria a pena.find
comando encontra é passado como argumentotar
. O{}
diz onde você quer esses resultados para ir no correspondente-exec
comando. O+
diz para adicionar quantos resultados defind
como se encaixam na linha de comando e chamartar
apenas um par de vezes, em vez de cada vez que um resultado é encontrado.regex
etar
porque não há como isolar os diretórios de ponto (.blah/
). O Tar não usa a barra à direita ao excluir.Esse tipo de controle sobre os arquivos correspondentes está fora da zona de conforto do alcatrão. Suas regras para arquivos correspondentes são limitadas a correspondências simples sobre nomes.
find
é uma maneira, mas como você tem o zsh, é mais fácil:Entre
.
parênteses no final da expressão curinga é um qualificador global que diz "corresponder apenas aos arquivos regulares".Links simbólicos para arquivos regulares não são correspondentes. Se você mudar para
.*(-.)
, eles serão incluídos, mas o arquivo não terminará no arquivo morto, a menos que também esteja incluído. Se você deseja substituir o link simbólico por seus destinos, faça isso.*(-.:A)
-:A
adiciona o modificador de expansão do histórico que resolve todos os links simbólicos a um caminho que não usa links simbólicos.fonte
Essa resposta é baseada no slm, mas também mostrarei como incluir diretórios começando com
.
Para compactar arquivos de ponto no diretório inicial:
Para incluir diretórios:
O
?
é opcional no primeiro comando, mas não no segundo, caso contrário,find
incluirá o.
diretório (atual).fonte
A respeito:
fonte