root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Como posso resolver esse problema e manter os /
nomes dos arquivos?
-C /
ao extraí-lo.
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Como posso resolver esse problema e manter os /
nomes dos arquivos?
-C /
ao extraí-lo.
Respostas:
Use a opção --absolute-names
ou -P
para desativar esse recurso.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
-C /
opção descrita na resposta do @Marcus se livrará da mensagem STDERR, se esse for seu objetivo principal.
Na verdade, isso é um recurso, não um problema. Arquivos com locais absolutos são um risco de segurança. Os invasores podem usar esses arquivos para induzir os usuários a instalar arquivos em locais críticos do sistema.
Sim, você poderia usar -P
. Mas o que há de errado em permitir que o tar remova a barra e simplesmente exigir que o usuário do arquivo faça a extração explicitamente no diretório raiz? Então eles impactam conscientemente locais críticos do sistema e não podem fazê-lo por acidente.
tar
. Essa mensagem em particular estava causando tar
a saída com um status de 1
, o que estava fazendo com que eu recebesse alertas de email falsos em backups bem-sucedidos, simplesmente porque tar
estava gravando essa mensagem no STDERR. cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
- por exemplo, se você estiver fornecendo algum tipo de recurso de captura de imagem do sistema de arquivos no FUSE. Às vezes, você pode querer descompactar um instantâneo em um diretório específico, e não cwd
da perspectiva do usuário.
Se você quiser se livrar da "Removendo` `/ 'principal dos nomes de membros" sendo impressa no STDERR, mas ainda assim desejar deixar de fora as barras principais, como o tar sabiamente faz por padrão, eu vi uma excelente solução aqui pelo comentarista timsoft.
A solução envolve usar a opção -C para alterar o diretório para a raiz (/) e especificar a árvore de arquivos a ser arquivada sem uma barra inicial, porque agora você só precisa de um caminho relativo. Isso faz o mesmo que um comando tar create normal, mas nenhuma remoção é necessária:
tar fcz bkup.tar.gz -C / home/foo/
tar c -C / home/foo/*
), porque o shell não sabe sobre a raiz alterada. Mas ainda é uma boa resposta para outros casos.
-C /
não funciona para mim, ponto final. Isso não impede o stderr para mim.
Um mês atrasado, mas achei a solução mais apropriada para o meu caso (em um script shell): ir para o diretório pai e executar o comando lá.
cd /var/www/
tar -czf mysite.gz mysite
Ao invés de:
tar -czf /var/www/mysite.gz /var/www/mysite
Isto é como eu fiz isso usando o método de força bruta: 2>&1 | grep -v "Removing leading"
.
Por exemplo:
tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v "Removing leading"
tar
comando pode retornar 2
erro fatal.
Resolvi esse problema com:
cd /home/foo && tar czf ~/backup.tar.gz .
Dessa forma, você não está tentando colocar caminhos absolutos no arquivo tar, em primeiro lugar. Se você deseja descompactá-lo na raiz do sistema de arquivos, basta
cd / && tar xzf backupt.tar.gz
depois de transferi-lo.