Eu tenho um pequeno dilema aqui ...
Eu precisava mover cerca de 70 GB de arquivos de um dos meus servidores para outro, então decidi que ordená-los e enviar o arquivo seria a maneira mais rápida.
No entanto, o servidor de recebimento tem apenas 5 GB de espaço restante após receber o arquivo tar.
Existe alguma maneira de extrair o alcatrão 'no local'? Não preciso manter o arquivo depois que ele foi extraído, por isso fiquei pensando se é possível fazer isso.
Edit: Note-se que o arquivo já foi enviado, e eu gostaria de evitar reenviar através de um método diferente.
Se a outra máquina tiver ssh, eu recomendaria o rsync como outra alternativa que não use um arquivo tar:
E tenha cuidado com os principais
/
Editar atualização
Bem, vejo como isso agora é uma ótima opção se você não conseguir excluí-lo e recomeçar com o rsync. Eu provavelmente tentaria um extrato seletivo e excluiria do alcatrão.
extrato seletivo:
exclusão seletiva:
No entanto, parece que você passará muito tempo codificando um script para isso ...
fonte
Basicamente, o que você precisa é a possibilidade de inserir o arquivo no alcatrão e "cortar" a frente à medida que avança.
No StackOverflow, alguém perguntou como truncar um arquivo na frente , mas parece que não é possível. Você ainda pode preencher o início do arquivo com zeros de uma maneira especial, para que o arquivo se torne um arquivo esparso , mas não sei como fazer isso. No entanto, podemos truncar o final do arquivo. Mas o tar precisa ler o arquivo para a frente, não para trás.
Solução 1
Um nível de indireção resolve todos os problemas. Primeiro inverta o arquivo no local, depois leia-o para trás (o que resultará na leitura do arquivo original para a frente) e trunque o final do arquivo invertido à medida que avança.
Você precisará escrever um programa (c, python, qualquer que seja) para trocar o início e o final do arquivo, pedaço por pedaço, e depois canalizar esses pedaços para tar, enquanto trunca o arquivo um pedaço por vez. Essa é a base da solução 2, que talvez seja mais simples de implementar.
Solução 2
Outro método é dividir o arquivo em pequenos pedaços no local e excluí-los à medida que os extraímos. O código abaixo tem um tamanho de bloco de um megabyte, ajuste de acordo com suas necessidades. Maior é mais rápido, mas ocupa mais espaço intermediário ao dividir e durante a extração.
Divida o arquivo archive.tar:
Canalize esses arquivos no tar (observe que precisamos da variável chunkprefix no segundo terminal):
Como usamos um pipe nomeado (
mkfifo fifo
), você não precisa canalizar todos os pedaços de uma só vez. Isso pode ser útil se você estiver realmente com pouco espaço. Você pode seguir as seguintes etapas:while [ -e … ]; do cat "$chunk…; done
loop terminar (segundo terminal):tar
comando, NÃO remova o fifo (primeiro terminal), mas você pode executarsync
, por precaução,while [ -e … ]; do cat "$chunk…; done
linhas novamente.É claro que tudo isso é de alta tensão , você deve verificar primeiro se tudo está bem em um arquivo fictício, porque se você cometer um erro, adeus aos dados .
Você nunca saberá se o primeiro terminal (
tar
) realmente terminou o processamento do conteúdo do fifo; portanto, se preferir, execute isso em vez disso, mas não terá a possibilidade de trocar facilmente pedaços com outro disco:aviso Legal
Observe que, para que tudo isso funcione, seu shell, cauda e truncado devem manipular números inteiros de 64 bits corretamente (você não precisa de um computador de 64 bits nem de um sistema operacional para isso). O meu funciona, mas se você executar o script acima em um sistema sem esses requisitos, perderá todos os dados em archive.tar .
E, em qualquer caso, algo que não dê errado, você perderá todos os dados em archive.tar de qualquer maneira, portanto, certifique-se de ter um backup dos seus dados.
fonte
Se você tiver arquivos de objetos a serem movidos, tente removê-los. Isso economizará uma quantidade considerável de espaço.
fonte