Sei que copiar ou transferir o que era originalmente um arquivo esparso sem usar um utilitário que entenda arquivos esparsos fará com que os 'furos' sejam preenchidos. Existe um método ou utilitário para ativar o que antes era um arquivo esparso?
Por exemplo:
crie um arquivo esparso:
% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
Existe alguma maneira de:
% resparse TEST2
to get:
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
files
utilities
sparse-files
user25849
fonte
fonte
rsync -aS
.Respostas:
Edit 2015
a partir do util-linux 2.25, o
fallocate
utilitário no Linux tem uma opção-d
/--dig-hole
para isso.Cavaria um buraco para cada bloco cheio de zeros no arquivo
Em sistemas mais antigos, você pode fazer isso manualmente:
O Linux tem uma
FALLOC_FL_PUNCH_HOLE
opção parafallocate
isso. Encontrei um script no github com um exemplo:Usando FALLOC_FL_PUNCH_HOLE do Python
Eu o modifiquei um pouco para fazer o que você pediu - faça furos em regiões de arquivos preenchidos com zeros. Aqui está:
Usando FALLOC_FL_PUNCH_HOLE do Python para fazer furos em arquivos
Exemplo:
Observe que
punch.py
apenas blocos de 4096 bytes são perfurados, portanto, ele pode não tornar um arquivo exatamente tão esparso quanto era quando você iniciou. Poderia ser mais inteligente, é claro. Além disso, ele é apenas levemente testado ; portanto, tenha cuidado e faça backups antes de confiar nele!fonte
Se você deseja tornar um arquivo escasso, pode fazê-lo diretamente com
dd
.Do
dd(1)
manual:Portanto, observe que ele buscará apenas se o bloco inteiro estiver vazio. Para uso escasso máximo
bs=1
.fonte
bs=512
que realmente não faz sentido, pois os discos são dispositivos de bloco. (bs=4096
em unidades mais recentes)cp --sparse=always zeropadded.iso isnowsparse.iso
Curto
tar
-lo com uma-S
bandeira (assumindo tar GNU), e re-executando oscp
... não. Nenhum utilitário que eu conheça teria como saber onde estavam os "buracos".fonte
Eu tive boa sorte com isso:
As
-I
forças rsync para atualizar todos os arquivos, independentemente de ele pensa que eles mudaram ou não; isso-S
faz com que os novos arquivos sejam esparsos.-a
faz com que isso aconteça recursivamente para que você possa sparsify árvores de diretório inteiras em um comando.Não é tão bom quanto uma ferramenta sob medida que persegue buracos e os destrói
FALLOC_FL_PUNCH_HOLE
, mas é melhor do que ter que duplicar árvores de diretório inteiras.fonte