Tar um arquivo com um nome diferente

3

Para tornar meu ambiente implantável, ocasionalmente coloco alguns arquivos e scripts úteis:

tar -czvf env.tgz .vimrc .vim/ bin/lsl bin/s

Eu gostaria de adicionar .bashrc ao mix, mas eu tenho algumas informações confidenciais lá, então eu mantenho o .bashrc-deploy que eu posso simplesmente renomear uma vez que o tarball esteja no novo servidor. No entanto, eu realmente gostaria que o tarball tivesse o nome correto .bashrc do get-go para que eu não tivesse que renomear. Eu considerei escrever um script que iria temporariamente renomear os arquivos e fazer o tarball, assim:

#!/bin/bash
mv .bashrc .bashrc-real
mv .bashrc-deploy .bashrc
tar -czvf env.tgz .bashrc .vimrc .vim/ bin/lsl bin/s
mv .bashrc .bashrc-deploy
mv .bashrc-real .bashrc

No entanto, tar tem alguma maneira interna de armazenar someFile com o nome anotherName no tarball?

    
por dotancohen 13.11.2012 / 11:58

3 respostas

4

Uma maneira de fazer isso é uma carga de cadeia.

Em .bashrc :

#!/bin/bash

# ...
# Non-private information
# ...

[[ -r ~/.bashrc-private ]] && . ~/.bashrc-private

Em seguida, coloque (apenas) suas coisas particulares em ~/.bashrc-private e tudo mais em ~/.bashrc . Em seguida, implemente apenas ~/.bashrc .

    
por 13.11.2012 / 12:05
5

Com pax (o comando padrão (POSIX) para criar tar archives) e bsdtar veja a opção -s :

pax -s '/\.bashrc-deploy/.bashrc/' -w -x ustar . | gzip > a.tar.gz

bsdtar -s '/\.bashrc-deploy/.bashrc/' -zcf a.tar.gz .

No entanto, observe que o acima substituirá a string .bashrc-deploy por .bashrc em qualquer caminho de arquivo de qualquer membro a ser adicionado ao archive. Se você quiser substituir apenas o ./.bashrc-deploy no diretório atual, será necessário escrevê-lo:

pax -s '|^\./\.bashrc-deploy$|./.bashrc|' -w -x ustar .

(apesar de ler a especificação POSIX pax, não tenho certeza se é garantido que funcione assim com todas as implementações pax. Deve funcionar com o bsdtar, já que há apenas uma implementação).

    
por 13.11.2012 / 12:34
3

Com o GNU tar (a implementação de tar padrão no Linux não embarcado e no Cygwin):

tar czf env.tgz --transform 's/-deploy$//' .bashrc-deploy .profile …

Isso também é possível com o pax, o substituto POSIX para cpio e tar, que infelizmente está faltando em muitas instalações padrão do Linux, e também com o tar do BSD:

pax -w -x ustar '-s/-deploy$//' .bashrc-deploy .profile … | gzip >env.tgz
bsdtar -czf env.tgz '-s/-deploy$//' .bashrc-deploy .profile …

Nos três casos, a sintaxe s/REGEX/REPLACEMENT/ é igual a ed ou sed .

Eu questiono sua abordagem. Ter arquivos com o mesmo nome, mas conteúdos diferentes em máquinas diferentes, é difícil de manter. Além disso, é fácil cometer um erro se alguns arquivos devem permanecer privados. Minha recomendação é armazenar seus arquivos de configuração em subdiretórios e usar links simbólicos. Por exemplo, se .bashrc precisar ser particular e específico do site e .profile precisar ser público e for o mesmo em todos os lugares:

.bashrc -> etc/local/private/.bashrc
.profile -> etc/.profile

Torne etc/local um link simbólico para um diretório cujo nome é dependente do site (por exemplo, ~/etc/home ou ~/etc/work ), garanta que ~/etc/private e ~/etc/*/private sejam acessados somente por você e que você esteja definido . Você pode implantar o diretório ~/etc inteiro e só precisará definir o link simbólico etc/local depois de descompactar o arquivo (ou, melhor ainda, fazer o check-out de controle de versão ).

Para um arquivo como .bashrc , que é provavelmente público e independente do site, divida o arquivo em duas (ou até quatro) partes, público e privado (além de arquivos específicos do site, se necessário). A parte principal inclui as partes locais:

if [ -e ~/etc/private/.bashrc ]; then . ~/etc/private/.bashrc; fi
if [ -e ~/etc/local/.bashrc ]; then . ~/etc/local/.bashrc; fi
if [ -e ~/etc/local/private/.bashrc ]; then . ~/etc/local/private/.bashrc; fi

Em arquivos escritos em uma linguagem de programação, você pode testar dinamicamente o nome do host ou o nome do domínio ou outra característica dependente do site, o que permite ter um único arquivo para manter.

case $HOSTNAME in
  darkstar) alias foo=some-local-command;;
esac

É um pouco surpreendente ter conteúdo confidencial em .bashrc . Se você estiver definindo variáveis de ambiente, eles pertencem a ~/.profile .

    
por 13.11.2012 / 23:01

Tags