Observação: o comando abaixo faz um pouco mais do que você pediu, mas pode ser extremamente útil para outras pessoas.
Aqui está um comando que eu trabalhei com um colega e dei para as equipes de suporte de aplicativos que precisam lidar com discos cheios:
find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' | sort -rn | head | cut -f2- | xargs -n1 ls -lh | awk '{print $5, $NF}'
Aqui está o mesmo comando com quebras de linha para facilitar a leitura:
find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' |
sort -rn | head | cut -f2- |
xargs -n1 ls -lh | awk '{print $5, $NF}'
Este comando imprime os 10 maiores arquivos no sistema de arquivos raiz, junto com o tamanho de arquivo legível para cada um.
Este comando precisa ser executado como root para resultados precisos.
-xdev
evita ultrapassar os limites do sistema de arquivos, o que pode ser importante se o NFS for lento.
/var/log/lastlog
é ignorado, pois é um arquivo esparso que falsamente reporta um tamanho enorme (ou seja, não está contribuindo para problemas completos do disco).
-printf
é específico do GNU find. Neste caso, imprime o tamanho do arquivo em bytes, seguido do caminho completo do arquivo.
Você pode realmente deixar tudo fora após o comando head
e a única coisa que você perderá são os tamanhos de arquivos legíveis por humanos.
Então, o seguinte funciona bem:
find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' | sort -rn | head
Este comando não funciona se você tiver nomes de arquivos com novas linhas neles. Mas como este comando é destinado a manuseio manual por um operador humano (não use em scripts), isso não é crucial.
Agora, para responder à sua pergunta específica:
My goal is to measure the file size (in MB or GB) for every file on my Linux system, recursively recording the filename and filesize, and piping the output into a tab-delimited text file.
Eu vou ignorar o requisito de MB ou GB e simplesmente reportar o tamanho do arquivo em bytes, pois é MUITO, MUITO mais fácil de fazer. Veja o comando acima para saber como fazer isso se você realmente precisar.
sudo find / -printf '%s\t%p\n' > outputfile.txt