A diferença entre os valores é a seguinte.
Do manual de stat (2)
struct stat {
// snip
off_t st_size; /* total size, in bytes */
// snip
blkcnt_t st_blocks; /* number of blocks allocated */
// snip
};
The st_blocks field indicates the number of blocks allocated to the file, 512-byte units. (This may be smaller than st_size/512, for example, when the file has holes.)
O tamanho relatado por ls é st_size
, o tamanho relatado por du é st_blocks * 512
O valor relatado por du é o número de bytes usados pelo arquivo no sistema de arquivos / disco, e o valor relatado por ls é o tamanho / tamanho real do arquivo quando você interage com ele. (Além de operar com uso em disco, du também conta apenas arquivos hardlilnked uma vez)
Qual valor é o "correto" depende do contexto. Se você está após o uso do disco du está correto, se você está se perguntando quantos bytes estão no arquivo, ls / st_size
está correto.
Além disso, você pode usar várias opções get ie du (--apparent-size) para usar o tamanho reportado por st_size
ou você pode obter ls (-s) para relatar o número de blocos usados.
Sua suposição de que seu arquivo de registro é um arquivo esparso parece plausível, no entanto, a razão pela qual eu não sei.