arquivos tar de outro diretório sem copiá-los

10

Isso deve ser muito simples para especialistas aqui.

Eu tenho uma conta Linux com cota de disco do usuário de apenas 6 GB. Há algumas pastas de dados /optcom cerca de 3 GB de dados quando compactado aparece 1 GB. Existem alguns links simbólicos dentro data-folder. Normalmente, para fazer um backup do trabalho, eu costumava fazer o seguinte.

cp -rvfL /opt/data-folder ~/
cd ~/
tar -zcvf data-folder.tar.gz data-folder
rm -rvf data-folder

Agora eu já consumi 2,5 GB na minha cota de disco do usuário, tenho apenas espaço suficiente para copiar arquivos para minha casa, mas não para tarela novamente.

Existe alguma maneira de tar e copiar a pasta com um único comando, digamos, usando um pipe.

PS Não consigo entrar /optporque só tenho acesso de leitura /opt.

Kamath
fonte
Você certamente pode ativar / desativar, não pode escrever lá, só isso. O sinalizador 'f' para tar (3) diz para depositar o resultado nesse arquivo, que pode muito bem estar em outro lugar. Ou seja cd /opt; tar zcf $HOME/junk.tar.gz junk,.
vonbrand

Respostas:

5

Deseja criar um arquivo tar fora do local em que os arquivos precisam residir?

Existem diversas formas de fazer isto.

Se for para ser criado localmente (= na mesma máquina):

tar czvf /path/to/destination/newfile.tar.gz  ./SOURCEDIR_OR_FILES

Você pode adicionar arquivos ou diretórios adicionais ao tar no final desse comando.

Se for para ser criado remotamente (ou seja, você deseja criar o arquivo tar em um host remoto daquele que contém os dados a serem tarados):

tar czvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cat > newfile.tar.gz'

A versão posterior é muito versátil. Por exemplo, você também pode "duplicar" um diretório + subdiretora usando a mesma técnica:

Duplique um diretório + subdivide para outro diretório local:

tar cf - ./SOURCEDIR_OR_FILES | ( cd LOCAL_DEST_DIR && tar xvf - )

Duplique um diretório + subdivide para outro diretório remoto:

tar cvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cd REMOTE_DEST_DIR && tar xf - '

Solte o 'v' se você não precisar exibir arquivos como são tar-ed (ou não classificados): ele será muito mais rápido, mas não dirá muito, a menos que haja um erro.

Eu uso ". / ..." para a fonte forçar o tar a armazená-lo como um caminho RELATIVO. Em alguns casos, você deseja adicionar informações adicionais sobre o caminho:

Por exemplo, para tar os arquivos crontab, incluindo o arquivo em / etc, você pode:

cd / ; tar czf all_crons.tgz  ./etc/*cron*  ./var/spool/cron

Eu uso de propósito o caminho relativo: algumas versões antigas do tar pode ser arquivos perigosos e extrair com seu caminho GLOBAL original, o que significa que você pode fazer: cd /safedir ; tar xvf sometare tem os arquivos com nomes globais sobrescrever arquivos em seu caminho original, que está fora de / safedir e não por baixo! Muito perigoso e ainda possível, pois existem servidores de produção antigos por aí. É melhor ser usado para usar caminhos relativos o tempo todo, mesmo se você usar um tar mais recente.

Olivier Dulac
fonte
outro não diz respeito a diferenças entre alcatrões: em alguns você pode precisar usar em -cvfvez de cvf, outros não reconhecerão o -estilo. E zcostumava significar "compactar com 'compactar'", mas no tar 'recente' significa "compactar com gzip". Você pode saber que a compressão é usado em um arquivo com: file zefile. E, em seguida, renomeá-lo em conformidade (se o seu uso tar compress, deve melhor ser renomeado .tar.Z não .tar.gz)
Olivier Dulac
0

Use a -hopção tar. Na página do manual:

-h, --dereference
don't archive symlinks; archive the files they point to

então você pode usar tar -zcvfh data-folder.tar.gz /opt/data-folder

harish.venkat
fonte
Ohh, eu deveria ter mencionado isso, já tentei tar -zcvfh ~ / data-folder.tar.gz / opt / data-folder. Estou entrando em algum tipo de problema de arquivo circular. Eu continuo copiando alguns arquivos e nunca acaba.
Kamath
Parece que há um link simbólico circular em uma subpasta de dados.
Kamath
2
@AUZKamath, isso é um bug no tar GNU. Você pode querer tentar bsdtarem vez disso, ou pax( cd /opt && pax -Lw data-folder | gzip > ~/data-folder.tar.gz) que detectar os loops
Stéphane Chazelas
1
@AUZKamath Você pode tar e remover simultaneamente os arquivos do seu diretório pessoal tar -rf <tarfilename> <filename>para adicionar ao arquivo tar existente.
precisa saber é o seguinte
1
@ Stephanie Chazelas, funciona, você deve colocá-lo como resposta.
Kamath