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. ``