Uma maneira de isso acontecer é arquivos com "buracos": arquivos esparsos . Suponha que um programa faça algo como:
fd = open("somefile", O_RDWR);
seek(fd, 1024, SEEK_SET);
write(fd, "blah blah", 9);
A chamada do sistema seek()
ignora o que seria o primeiro bloco de disco do arquivo (acho que já faz um tempo desde que usei o Solaris) e grava 9 bytes no segundo bloco. A maioria dos sistemas de arquivos Unix e Linux não alocarão o primeiro bloco de disco nunca gravado. Se você copiar o arquivo, ou arquivá-lo ou algo assim, ele crescerá, pois qualquer read()
feito nos primeiros 1024 bytes do arquivo retornará todos os bytes zero.
Dito isto, é muito raro encontrar tal situação. Eu procuraria mais por algum bug, como cópia dupla ou algo assim.
Você pode verificar se o arquivo de origem é esparso comparando seu tamanho e o uso do disco:
ls -l the_file
du -k the_file
Se a segunda figura (uso do disco) for menor que a primeira (tamanho real do arquivo), o arquivo é esparso.
Se o arquivo for escasso, você poderá usar rsync -a --sparse
para transferi-lo em vez de scp
. O Rsync pode copiar arquivos esparsos para arquivos esparsos se você informar.