Eu tenho o seguinte comando na parte de um script de shell de backup:
tar -cjf site1.bz2 /var/www/site1/
Quando listo o conteúdo do arquivo, recebo:
tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html
Mas eu gostaria de remover a parte /var/www/site1
dos nomes de diretório e arquivo dentro do arquivo morto, para simplificar a extração e evitar a estrutura inútil de diretório constante. Nunca se sabe, caso eu extraísse sites de backup em um local em que os dados da web não estivessem armazenados /var/www
.
Para o exemplo acima, eu gostaria de ter:
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
Portanto, quando extraio, os arquivos são extraídos no diretório atual e não preciso mover os arquivos extraídos posteriormente, para que as estruturas de subdiretórios sejam preservadas.
Já existem muitas perguntas sobre tar e backup em stackoverflow
e em outros lugares da Web, mas a maioria delas pede a remoção de toda a estrutura de subdiretórios (achatamento), ou apenas adiciona ou remove os nomes iniciais / (eu não não sei o que muda exatamente ao extrair), mas não mais.
Depois de ler algumas das soluções encontradas aqui e ali, bem como o manual, tentei:
tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/
Mas nenhum deles funcionou do jeito que eu quero. Alguns não fazem nada, outros não arquivam mais subdiretórios.
Está dentro de um script de shell de backup lançado por um Cron, então eu não sei bem, qual usuário o executa, qual é o caminho e o diretório atual; portanto, sempre é necessário escrever o caminho absoluto para tudo e prefere não alterar o diretório atual para evitar quebrar algo mais no script (porque ele não apenas faz backup de sites, mas também de bancos de dados, envia tudo isso para FTP etc.)
Como conseguir isso?
Acabei de entender como a opção -C funciona?
-C
apenas significa "alterar diretório", enquanto a substituição de um caminho (ou prefixo) pode ser feita apenas por--transform
. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512, você pode simplesmente -C (alterar o diretório) e --transformar: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. ``Respostas:
No exemplo acima, o tar mudará para o diretório
/var/www/site1
antes de fazer o seu trabalho porque a opção-C /var/www/site1
foi dada.De
man tar
:fonte
tar
para arquivar tudo no diretório atual. E-C
define o diretório atual.tar -czvf site1.tar.gz -C /var/www/ site1
(Observe o espaço, ainda estou usando o -C, para cd no diretório pai e especificando o diretório para tar em vez de ponto)./folders
como isso pode ser removido?A opção
-C
funciona; apenas para esclarecimentos, vou postar 2 exemplos:criação de um tarball sem o caminho completo: caminho completo
/home/testuser/workspace/project/application.war
e o que queremos éproject/application.war
o seguinte:Nota: existe um espaço entre
workspace
eproject
; O tar substituirá o caminho completo por justproject
.extração de tarball com alteração do caminho de destino (padrão para
.
, ie diretório atual)tar
extrairá o tarball com base no caminho especificado e preservará o caminho da criação; no nosso exemplo, o arquivoapplication.war
será extraído para/home/deploy/project/application.war
./home/deploy
: dado em extratoproject
: dado em criação de tarballNota: se você deseja colocar o tarball criado em um diretório de destino, basta adicionar o caminho de destino antes do nome do tarball. por exemplo:
fonte
Parece que a
-C
opção up to tar v2.8.3 não funciona de maneira consistente em todas as plataformas (SOs).-C
Diz-se que a opção adiciona um diretório ao arquivo, mas no Mac e Ubuntu ele adiciona um prefixo de caminho absoluto no arquivo tar.gz gerado.Portanto, a solução consistente e robusta é
cd
entrar em source_path (diretório pai de source_dir) e executarou
no seu script. Isso removerá o prefixo do caminho absoluto na estrutura de diretórios do arquivo tar.gz gerado.
fonte
-cvf
add depoistar
), acho que o arquivo tar.gz resultante não possui caminhos absolutos dentro dele, o que é consistente com várias outras respostas. Se você acha que o tar está desatualizado ou desatualizado nos dois sistemas que usei para teste, vincule-o a alguma documentação que suporte sua resposta. Eu acho que a-C
opção altera o diretório antes de executar (como em outras respostas). Quando o omito, o tar tenta adicionar lixo eletrônico./
, incluindo caminhos a partir de./
.cd
primeira. Sua resposta diz que a ferramenta funciona da maneira oposta de como os documentos dizem que funciona e como funciona no meu sistema, por isso é uma resposta errada. Você poderia consertá-lo facilmente.O comando a seguir criará um diretório raiz "." e coloque todos os arquivos do diretório especificado nele.
Se você deseja colocar todos os arquivos na raiz do arquivo tar, @chinthaka está certo. Apenas entre no diretório e faça:
Isso colocará todos os arquivos no cwd no arquivo tar como arquivos raiz.
fonte
O uso do "point" leva à criação de uma pasta chamada "point" (no Ubuntu 16).
Eu lidei com isso com mais detalhes e preparei um exemplo. Gravação em várias linhas, além de uma exceção.
fonte
.
, que é o diretório atual. No contexto datar.gz
estrutura da, isso é apenas o nível básico / raiz / superior, certo?Se você deseja arquivar um subdiretório e aparar o caminho do subdiretório, este comando será útil:
fonte