Obtendo tamanho apenas com dois arquivos

51

Como posso obter o tamanho de todos os arquivos e todos os arquivos em seus subdiretórios usando o comando du.

Estou tentando o seguinte comando para obter o tamanho de todos os arquivos (e arquivos em subdiretórios)

find . -type f | du -a

Mas isso também imprime os tamanhos das pastas. Como posso obter uma lista de tamanhos de todos os arquivos e arquivos em subdiretórios? Eu também tentei o, exec flagmas não tenho certeza de como canalizar a saída para outro comando depois que ele executa os resultados do findinto du.

O sistema operacional é o AIX 6.1 com shell ksh.

Shardul Upadhyay
fonte

Respostas:

57

Eu costumo usar o -executilitário. Como isso:

find . -type f -exec du -a {} +

Eu tentei tanto no bash quanto no ksh com o GNU find. Eu nunca tentei o AIX, mas tenho certeza de que sua versão do find tem alguma -execsintaxe.

O seguinte trecho classifica a lista, maior primeiro:

find . -type f -exec du -a {} + | sort -n -r | less
rahmu
fonte
3
Eu usaria essa resposta se você não tiver acesso find -print0ou outros recursos do GNU. Se disponível, a substituição \;por \+resultará em menos invocações due, portanto, melhor desempenho.
Jw013 11/11
Obrigado, isso funciona muito bem, especialmente porque du oferece uma bandeira para o tamanho em unidades diferentes.
Shardul Upadhyay
Não consegui encontrar informações sobre a +opção. Essa é uma opção para duou para find? E por que isso resulta em menos ligações?
Amelio Vazquez-Reina
1
É uma opção padrão de find. Ele especifica para execo comando (no nosso caso du) apenas uma vez, com todos os resultados findfornecidos como argumentos sucessivos para o comando.
rahmu
wtf, por que não existe um comando comodu -f --threshold=1G
Alexander Mills
16

Se você possui utilitários GNU, tente

find . -type f -print0 | du --files0-from=-
jw013
fonte
O comando está falhando dizendo que print0 não é um comando válido e que o último menos não era um sinalizador reconhecido. Não acho que essa abordagem funcione porque man dunão lista uma filesou fromsinalização.
Shardul Upadhyay
Você deve adicionar seu sistema operacional como uma marca à pergunta. Presumi que você tivesse o GNU, mas esqueci de mencionar isso.
Jw013 11/11
1
Tenha um voto positivo em mim! Sua solução específica trabalha du -chpara obter um total geral de arquivos correspondentes:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Michael Goldshteyn
9

Eu geralmente uso:

find . -type f -print0 | xargs -r0 du -a

Xargs geralmente chama o comando, mesmo se não houver argumentos passados; xargs du </dev/nullainda será chamado, xargs -r du </dev/nullnão será chamado du. O -0argumento procura por seqüências terminadas em nulo em vez de nova linha finalizada.

Então eu costumo adicionar | awk '{sum+=$1} END {print sum}'no final para obter o total.

Arcege
fonte
2
O then I usually addvale de ouro :-)
Radek
2

Aqui está uma versão com nomes longos de parâmetros e classificação humana.

find . -type f -exec du --human {} + | sort --human --reverse | head

Também não vi necessidade de -a/--allpassar para du.

Tarrasch
fonte
-2

arquivos específicos no diretório atual

du -ch files*

é mais curto e funciona para mim

du -sh .

para dir atual e todos os arquivos em sub

du (GNU coreutils) 8,30

baixinha
fonte
1
(1) Como assim du -ch files*? Suponha que o diretório atual contém ant, apple, banana, bat, cat, corn, date, e dog, onde os nomes de animais são subdiretórios e as frutas / vegetais nomes são arquivos - o comando você usaria para obter apenas os arquivos? Ou não é isso que você quis dizer? (2)  du -sh .relatará apenas um total geral de tudo no diretório atual e abaixo dele, e não os arquivos em si. Esse é exatamente o oposto do que a pergunta fazia.
G-Man diz 'Reinstate Monica' em