ls -l fornecerá o tamanho aparente do arquivo, que é o número de bytes que um programa lerá se ler o arquivo do início ao fim. du lhe daria o tamanho do arquivo "no disco".
Por padrão, du fornece o tamanho do arquivo em número de blocos de disco, mas você pode usar -h para obter uma unidade legível por humanos. Veja também o manual para du em seu sistema.
Note que com o du do GNU coreutil (que é provavelmente o que você tem no Linux), usar -b para obter bytes implica na opção --apparent-size . Não é isso que você deseja usar para obter o número de bytes. Em vez disso, use --block-size=1 ou -B 1 .
Com o GNU ls , você também pode fazer ls -s --block-size=1 no arquivo. Isso dará o mesmo número que du -B 1 para o arquivo.
Exemplo:
$ ls -l file
-rw-r--r-- 1 myself wheel 536870912 Apr 8 11:44 file
$ ls -lh file
-rw-r--r-- 1 myself wheel 512M Apr 8 11:44 file
$ du -h file
24K file
$ du -B 1 file
24576 file
$ ls -s --block-size=1 file
24576 file
Isso significa que este é um arquivo de 512 MB que leva cerca de 24 KB em disco. É um arquivo escasso (principalmente zeros que não são realmente gravados no disco, mas representados como "buracos" lógicos no arquivo). Arquivos esparsos são comuns quando se trabalha com arquivos grandes pré-alocados, por exemplo, imagens de disco para máquinas virtuais, etc. Criar um arquivo esparso é rápido, enquanto preenchê-lo com zeros é lento (e desnecessário).
Veja também o manual de fallocate em seu sistema Linux.