Mostrar a soma dos tamanhos de arquivo na listagem de diretórios


72

O dircomando de listagem de diretórios do Windows possui uma linha no final, mostrando a quantidade total de espaço ocupado pelos arquivos listados. Por exemplo, dir *.exemostra todos os .exearquivos no diretório atual, seus tamanhos e a soma total de seus tamanhos. Adoraria ter uma funcionalidade semelhante ao meu diralias no bash, mas não sei exatamente como fazê-lo.

Atualmente, eu tenho alias dir='ls -FaGl'no meu .bash_profile, mostrando

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

por exemplo. Tomando as respostas desta pergunta :

dir | awk '{ total += $4 }; END { print total }'

o que me dá o total, mas não imprime a lista de diretórios em si. Existe uma maneira de alterar isso em um script de uma linha ou shell, para que eu possa passar os lsargumentos que quiser dire obter uma lista completa mais a soma total? Por exemplo, eu gostaria de executar dir -R *.jpg *.tifpara obter a listagem e o tamanho total desses tipos de arquivo em todos os subdiretórios. Idealmente, seria ótimo se eu pudesse obter o tamanho de cada subdiretório, mas isso não é essencial.


5
Por que não ls -lhajuda você? Imprime a soma total no topo. Você também pode executar du -sh *.exepara obter informações sobre o uso do espaço em disco em formato legível por humanos.
precisa saber é o seguinte

@ashwin Eu não sei o que o 'total' ls -lhestá imprimindo, mas nem sempre está relacionado ao que os awkscripts abaixo calculam ou ao que eu adiciono manualmente. Às vezes, é próximo ao número de KB de arquivos no diretório, mas parece não ter efeito nos tamanhos alocados dos subdiretórios. Eu ficaria muito grato se você poderia me apontar para uma explicação sobre o que exatamente esse número é ...
MattDMo

ver se a minha resposta abaixo funciona para você
bagavadhar

11
ls -lhnão mostra o total de tamanho de um dir calcular o seu conteúdo
aequalsb

Respostas:


24

A função a seguir faz a maior parte do que você está pedindo:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... mas não vai dar o que você está pedindo dir -R *.jpg *.tif, porque não é assim que ls -Rfunciona. Você pode querer brincar com o findutilitário para isso.


11
Isso é verdade, se você procura essencialmente o tamanho do conteúdo de cada arquivo, NÃO o tamanho que o arquivo consome no disco. Essa distinção é mais pronunciada para arquivos muito pequenos. Na minha distro, cada arquivo tem espaço alocado no disco em pedaços de 4 KB (portanto, um arquivo de 300 bytes ainda usa 4K em um disco, conforme relatado pelo comando du). Dado que o OP estava procurando "quanto espaço cada arquivo ocupa", então du é o caminho para fazê-lo.
Jon V

11
dirjá é o nome de um popular GNU coreutil, prefiro não nomear uma função como essa.
sobremesa

Corrija para que funcione no Linux e no OS-S e o seu "-a" inclui "." e "..", o que não é bom:) Aqui está o comando fixo: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; impressão }; END {print "total:" total} '; }
Dmitry Shevkoplyas

148

Já existe um comando UNIX para isso: du

Apenas faça:

du -ach 

Conforme a convenção, você pode adicionar um ou mais caminhos de arquivo ou diretório no final do comando. -hé uma extensão para converter o tamanho em um formato adequado para humanos, -afornece o tamanho "aparente" (tamanho do arquivo em vez do uso do disco) e -cfornece um total no final.


12
Sim, du funciona bem. Você pode usar a opção -c (igual a --total) para obter um total no final da lista.
MikeB 21/05

6
Observe que dufornece o uso do disco, não a soma dos tamanhos dos arquivos.
Stéphane Chazelas

7
du -hnão soma os tamanhos dos arquivos passados ​​para ele. du -h *.somostra o tamanho de cada arquivo, mas não a soma. Eu acho que o que você está querendo aqui é du -hc *.so(ou até du -hc *.so | tail -1). Mas é claro que ele também quer a lista de diretórios.
Expiação limitada

11
Este comando funciona apenas com uma lista curta de arquivos. Veja o que acontece quando você tem 850000 arquivos em um diretório !!!
Hamid FzM

3
! -ameios --all. Considere, em vez utilizando--apparent-size
Arnauld VM

17

Você pode usar du -h -c directory|tail -1

Isso irá gerar uma única linha com o uso da memória.


15
du -hs directoryse você quer apenas o total.
Stéphane Chazelas

8

Simplesmente imprima a linha atual que você está somando o total de:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'

6

com perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Tamanho de todos os arquivos PDF não ocultos no diretório atual.


1

Adicionar o seguinte a .bash_profile ou .bashrc funciona para mim.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Agora, quando eu faço um dir * .mp3, ele faz recursivamente e imprime o total no final. Você pode controlar a profundidade desejada, adicionando um parâmetro maxdepth à localização. Eu sei que executar encontrar duas vezes não é uma idéia muito eficaz. Mas eu não conseguia pensar em uma maneira melhor. Pelo menos, ele faz o trabalho.


1

Usar du e uma declaração awk como a mencionada acima fornecerá o que você está procurando.

Exemplo: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Isso listará todos os arquivos na pasta Downloads do usuário abc que terminam em .jpg e imprime a soma de todos esses arquivos no final da listagem.


0

Para obter ambos, saída dir e cálculo de tamanho, sem usar nenhuma das outras opções propostas, você pode usar tee (1) e substituir o processo ...

dir | tee >( awk '{ total += $4 }; END { print total }' )

Não há necessidade de tee, apenasdir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
Não. Primeiro, apenas dar um comando não é uma resposta. Segundo, se você se desse ao trabalho de ler a pergunta toda, as outras respostas e os meus comentários, veria que NÃO é isso que eu quero.
precisa saber é o seguinte

Para ser justo com o pôster, este é o primeiro resultado da pesquisa no Google linux sum human readable sizese é o que estou procurando.
Sridhar Sarnobat 18/08

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.