Saída de arquivo e tamanho de arquivo recursivamente para todos os subdiretórios?

2

Meu objetivo é medir o tamanho do arquivo (em MB ou GB) para cada arquivo no meu sistema Linux, gravar recursivamente o nome do arquivo e o tamanho do arquivo e canalizar a saída em um arquivo de texto delimitado por tabulação.

Qual seria o comando apropriado para isso?

Pode-se tentar um comando como este:

ls -lhR > outputfile.txt

mas há motivos para pensar que isso é altamente ineficiente:

link

Seria mais apropriado usar um loop for?

    
por EB2127 13.03.2018 / 17:51

5 respostas

4

Tente isso (assumindo que o GNU find e os nomes dos arquivos não contenham caracteres de aspas duplas):

{
    printf '%s\t%s\n' size path
    find / \( -path /proc -o -path /sys \) -prune -o -printf '%s\t"%P"\n' |
        numfmt --to=iec
} > outputfile.csv

Verifique

man find | less +/'-printf format'

ou

info --ind=-printf find
    
por 13.03.2018 / 18:06
6
sudo du -h / 2>/dev/null > out.csv
  • Use sudo para garantir que você leia todos os arquivos.
  • Use -h com du para um formato de tamanho " h uman".
  • Não exibir erros ( 2>/dev/null , em que 2 é o erro padrão)
  • Enviar resultados para um arquivo ( > out.csv ).

Isso produz uma lista com o tamanho e o caminho do arquivo, com uma tabulação entre os valores.

    
por 13.03.2018 / 18:18
2

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
    
por 14.03.2018 / 02:20
2

Você deve verificar ncdu que é o comando du com ncurses que obtém o tamanho do arquivo de todas as pastas por padrão.

    
por 14.03.2018 / 03:15
1

Com o GNU stat e bash globstar :

shopt -s globstar
stat --printf="%s\t%n\n" -- ** | numfmt -d $'\t' --to=iec >out.csv

Isso inclui diretórios, mas também são arquivos ...

Como o @Patrick aponta, isso pode resultar em argument list too long devido ao ** . Pode-se usar find :

sudo find / -type f -exec stat --printf="%s\t%n\n" -- {} \; | numfmt -d $'\t' --to=iec
    
por 14.03.2018 / 00:20