Se eu for executado tar -cvf
em um diretório de tamanho 937MB para criar uma cópia para download fácil de uma estrutura de pastas profundamente aninhada, arrisco o preenchimento do disco, com a seguinte df -h
saída:
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Perguntas relacionadas:
- Se o disco estiver cheio, por que, por exemplo, o que o Linux (Amazon AMI) e / ou
tar
fará sob o capô? - Como posso determinar essas informações com precisão sem perguntar novamente?
tar
disk-usage
codecowboy
fonte
fonte
--totals
opção De qualquer maneira, se você encher o disco, você pode simplesmente excluir o arquivo, imho. Para verificar todas as opções disponíveis, você pode acessartar --help
.Respostas:
tar -c data_dir | wc -c
sem compressãoou
tar -cz data_dir | wc -c
com compressão gzipou
tar -cj data_dir | wc -c
com compressão bzip2imprimirá o tamanho do arquivo morto que seria criado em bytes, sem gravar no disco. Você pode comparar isso com a quantidade de espaço livre no dispositivo de destino.
Você pode verificar o tamanho do próprio diretório de dados, caso uma suposição incorreta tenha sido feita sobre seu tamanho, com o seguinte comando:
du -h --max-depth=1 data_dir
Como já foi respondido, o tar adiciona um cabeçalho a cada registro no arquivo morto e também arredonda o tamanho de cada registro para um múltiplo de 512 bytes (por padrão). O final de um arquivo é marcado por pelo menos dois registros consecutivos preenchidos com zero. Portanto, sempre é possível que você tenha um arquivo tar descompactado maior que os próprios arquivos, o número de arquivos e como eles se alinham aos limites de 512 bytes determina o espaço extra usado.
É claro que os próprios sistemas de arquivos usam tamanhos de bloco que talvez sejam maiores que o conteúdo de um arquivo individual; portanto, tenha cuidado ao desatá-lo, pois o sistema de arquivos pode não ser capaz de armazenar muitos arquivos pequenos, embora tenha espaço livre maior que o tamanho do alcatrão!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
fonte
-f -
para tar é redundante, pois você pode simplesmente deixar de fora o-f
argumento para escrever o resultado em stdout (ietar -c data_dir
).O tamanho do seu arquivo tar será 937 MB mais o tamanho dos metadados necessários para cada arquivo ou diretório (512 bytes por objeto) e preenchimento adicionado para alinhar os arquivos a um limite de 512 bytes.
Um cálculo aproximado indica que outra cópia dos seus dados deixará você com 3,4 GB de graça. Em 3,4 GB, temos espaço para cerca de 7 milhões de registros de metadados, assumindo nenhum preenchimento ou menos se você assumir uma média de preenchimento de 256 bytes por arquivo. Portanto, se você tiver milhões de arquivos e diretórios para tar, poderá encontrar problemas.
Você pode atenuar o problema
z
ouj
paratar
tar
como um usuário normal para que o espaço reservado na/
partição não seja tocado se você ficar sem espaço.fonte
tar
ele próprio pode relatar o tamanho de seus arquivos com a--test
opção:O comando acima não grava nada no disco e tem o benefício adicional de listar os tamanhos de arquivos individuais de cada arquivo contido no tarball. A adição de vários
z/j/xz
operandos aos dois lados da|pipe
manipulação manipulará a compactação como você deseja.SAÍDA:
Não totalmente certo do seu objetivo, mas se for para baixar o tarball, isso pode ser mais direto ao ponto:
Ou simplesmente copie com
tar
:fonte
tar
copiará a árvore para o disco local em um fluxo sem salvar nada no disco remoto, após o qual você poderá excluí-lo do host remoto e restaurá-lo mais tarde. Provavelmente, você deve adicionar-z
a compactação, como indica o goldilocks, para economizar largura de banda durante a transferência.-i
certo, desculpe!Eu fiz muita pesquisa sobre isso. Você pode fazer um teste no arquivo com uma contagem de palavras, mas ele não fornecerá o mesmo número de número que um
du -sb adir
.du
conta todos os diretórios como 4096 bytes e ostar
diretórios como 0 bytes. Você precisa adicionar 4096 a cada diretório:então você precisa adicionar todos os caracteres. Para algo parecido com isto:
Não tenho certeza se isso é perfeito, pois não tentei arquivos tocados (arquivos de 0 bytes) ou arquivos com 1 caractere. Isso deve te aproximar.
fonte
-cvf
não inclui nenhuma compactação, portanto, fazer isso em uma pasta de ~ 1 GB resultará em um arquivo tar de ~ 1 GB (a resposta do Flub tem mais detalhes sobre o tamanho adicional no arquivo tar, mas observe que mesmo se houver 10.000 arquivos, isso é apenas 5 MB). Como você tem mais de 4 GB de espaço livre, não, não preencherá a partição.A maioria das pessoas consideraria "mais fácil" sinônimo de "menor" em termos de download; portanto, você deve usar alguma compressão aqui.
bzip2
hoje em dia deve estar disponível em qualquer sistema com tar, eu acho, então incluirj
nos seus switches é provavelmente a melhor escolha.z
(gzip
) é talvez ainda mais comum e há outras possibilidades (menos onipresentes) com mais squash.Se você quer dizer,
tar
usa espaço em disco adicional temporariamente na execução da tarefa, tenho certeza de que não o faz por alguns motivos, um deles remonta a uma época em que as unidades de fita eram uma forma de armazenamento primário e duas teve décadas para evoluir (e estou certo de que não é necessário usar o espaço intermediário temporário, mesmo se houver compressão).fonte
Se a velocidade for importante e a compactação não for necessária, você pode conectar os wrappers syscall usados
tar
usandoLD_PRELOAD
, para alterartar
para calculá-lo para nós. Reimplementando algumas dessas funções para atender às nossas necessidades (calculando o tamanho dos possíveis dados do alcatrão de saída), somos capazes de eliminar muitoread
ewrite
isso é realizado na operação normal detar
. Isso ficatar
muito mais rápido, pois não é necessário alternar o contexto para o kernel em qualquer lugar próximo e somente ostat
arquivo / pasta de entrada solicitados precisa ser lido do disco em vez dos dados reais do arquivo.O código abaixo inclui implementações das
close
,read
ewrite
funções POSIX. A macroOUT_FD
controla qual descritor de arquivo esperamostar
usar como arquivo de saída. Atualmente, está definido como stdout.read
foi alterado para apenas retornar o valor de sucesso doscount
bytes em vez de preencher o buf com os dados, dado que os dados reais não foram lidos, o buf não conteria dados válidos para transmitir à compactação e, portanto, se a compactação fosse usada, calcularíamos um valor incorreto Tamanho.write
foi alterado para somar oscount
bytes de entrada na variável globaltotal
e retornar o valor de sucesso doscount
bytes apenas se o descritor de arquivo corresponderOUT_FD
; caso contrário, ele chamará o wrapper original adquirido viadlsym
para executar a chamada do sistema com o mesmo nome.close
ainda pré-forma toda a sua funcionalidade original, mas se o descritor de arquivo corresponder a OUT_FD, ele saberá que issotar
foi feito ao tentar gravar um arquivo tar; portanto, ototal
número é final e o imprime em stdout.Referência comparando uma solução em que o acesso ao disco de leitura e todos os syscalls da operação tar normal são executados na
LD_PRELOAD
solução.O código acima, um script de construção básico para criar o descrito acima como uma biblioteca compartilhada, e um script com a "
LD_PRELOAD
técnica" que o utiliza são fornecidos no repositório: https://github.com/G4Vi/tarsizeAlgumas informações sobre o uso do LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
fonte