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.

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

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=-

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.


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.


-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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.