Como descubro qual tipo de arquivo está ocupando mais espaço?

0

Eu tenho um zilhão de pequenos arquivos em uma hierarquia de pastas complexa; estes estão ocupando muito espaço (ou seja, terabytes). Eu gostaria de descobrir qual tipo de arquivo (ou seja, .pdf etc) está ocupando todo o espaço para que eu possa considerar a exclusão de todos os arquivos desse tipo.

Existe um comando bash / script que resolveria isso facilmente para mim? Um script python também seria viável, mas não tenho nenhum gui.

Obrigado! Alex

This seems relevant: https://stackoverflow.com/questions/1358920/bash-measure-disk-space-of-certain-file-types-in-aggregate

    
por Community 28.06.2010 / 21:00

3 respostas

1

Quicktut:

Listando todos os arquivos em um diretório:

import os
path="C:\somedirectory"  # insert the path to the directory of interest
dirList=os.listdir(path)
for fname in dirList:
    print fname

Você precisa fazer o recursivo acima para que ele funcione também nas subpastas.

Obtendo o tamanho do arquivo de um arquivo:

import os
b= os.path.getsize("/path/isa_005.mp3")

Obter extensão de arquivo:

import os
ext = os.path.splitext(file_name)[1]

Agora, tudo o que você precisa fazer é criar extensões de mapeamento de dicionário para o tamanho do arquivo acumulado e imprimir as dicionário (talvez após a classificação ou algo assim).

Espero que ajude.

    
por 28.06.2010 / 21:06
0

Acabei de escrever isso em cerca de 5 minutos. Em vez de os.path.getsize eu uso st_size de os.stat. Eu não acho que isso realmente importe. Eu uso os.walk para recursivamente "andar" através de todos os diretórios no atual diretor de trabalho '.' Isso não foi escrito para eficiência ou desempenho em mente, apenas para conseguir alguma coisa. O resultado final é um dicionário preenchido com extensões de arquivo para chaves e cada valor é convertido em uma string representando um formato legível por humanos do tamanho total para cada tipo de arquivo. Eu peguei um método escrito por outra pessoa para fazer a formatação humana. A última parte é um smancy de fantasia para ordenar os tipos de arquivo por tamanho. Se você apertar ctrl + c, ele mata o "dimensionamento" e apenas imprime os resultados que ele teve tempo de coletar. Muito divertido! Obrigado pelo passeio, aproveite.

import os

#using code ripped from:
#http://www.5dollarwhitebox.org/drupal/node/84
#to convert to human readable format
def convert_bytes(bytes):
   bytes = float(bytes)
   if bytes >= 1099511627776:
      terabytes = bytes / 1099511627776
      size = '%.2fT' % terabytes
   elif bytes >= 1073741824:
      gigabytes = bytes / 1073741824
      size = '%.2fG' % gigabytes
   elif bytes >= 1048576:
      megabytes = bytes / 1048576
      size = '%.2fM' % megabytes
   elif bytes >= 1024:
      kilobytes = bytes / 1024
      size = '%.2fK' % kilobytes
   else:
      size = '%.2fb' % bytes
   return size

typesizeH = {}
typesize = {}


try:
   for root, dirs, files in os.walk('.'):
      for file in files:
         prefix, extension = os.path.splitext(file)
         if extension not in typesize:
            typesize[extension] = 0
         typesize[extension] += os.stat(root + os.sep + file).st_size
except KeyboardInterrupt:
   pass


for key in typesize:
   typesizeH[key] = convert_bytes(typesize[key])

print str(typesizeH)

types = typesize.keys()
types.sort(cmp=lambda a,b: cmp(typesize[a], typesize[b]), reverse=True)
print "Filetype\tSize"
for type in types:
   print "%s\t%s" % (type, typesizeH[type])

Resultado:

Filetype        Size
.7z     99.84M
.hpp    42.88M
.lib    39.40M
.ncb    28.50M
.dll    27.87M
.exe    25.26M
.h      10.33M
.obj    10.18M
.zip    6.83M
.svn-base       3.92M
        3.52M
.txt    2.28M
.csv    1.09M
    
por 28.06.2010 / 22:21
0

Uma solução shell / gawk:

find: Imprimir nome do arquivo e tamanho para todos os arquivos

gawk: Cria uma matriz Assoc usando o tipo como chave e o tamanho somado como valor. No final da entrada: tamanho da impressão para todos os tipos.

find DIR -name "*.*" -type f -printf "%f %s\n" | awk '{sub(/.*\./,"",$1);count[$1]+=$2} END{for (var in count) print var, count[var];}'
    
por 28.06.2010 / 23:45