Как узнать, какой тип файла занимает больше места?

1856
Community

У меня есть миллион маленьких файлов в сложной иерархии папок; они занимают слишком много места (терабайты). Я хотел бы выяснить, какой тип файла (т.е. .pdf и т. Д.) Занимает всю комнату, чтобы я мог рассмотреть возможность удаления всех файлов этого типа.

Есть ли команда / сценарий bash, которая легко решит эту проблему? Сценарий Python также будет работать, но у меня нет графического интерфейса.

Спасибо! Alex

Это кажется актуальным: https://stackoverflow.com/questions/1358920/bash-measure-disk-space-of-termin-file-types-in-aggregate

0

3 ответа на вопрос

1
phimuemue

Quicktut:

Перечисление всех файлов в каталоге:

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

Вы должны сделать вышеупомянутый рекурсивный, чтобы заставить это работать также на подпапках.

Получение размера файла из файла:

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

Получить расширение файла:

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

Теперь все, что вам нужно сделать, - это создать расширения сопоставления словаря с накопленным размером файла и распечатать словарь (возможно, после сортировки или чего-то еще).

Надеюсь, поможет.

0

Я только написал это приблизительно через 5 минут. Вместо os.path.getsize я использую st_size os.stat. Я не думаю, что это действительно имеет значение. Я использую os.walk для рекурсивного «обхода» всех каталогов в текущем рабочем директоре '.' Это не было написано для эффективности или производительности, просто чтобы что-то сделать. Конечным результатом является словарь, заполненный расширениями файлов для ключей, и каждое значение преобразуется в строку, представляющую удобочитаемый формат общего размера для каждого типа файла. Я взял метод, написанный кем-то другим, чтобы сделать человеческое форматирование. Последняя часть - это какая-то необычная возможность сортировать типы файлов по размеру. Если вы нажмете Ctrl + C, это убьет «определение размера» и просто напечатает результаты, которые он успел собрать. Довольно весело! Спасибо за поездку, наслаждайтесь.

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]) 

Результат:

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 
0

Раствор оболочки / ястреба:

найти: напечатать имя файла и размер для всех файлов

gawk: создайте массив Assoc, используя тип в качестве ключа и суммируемый размер в качестве значения. В конце ввода: размер печати для всех типов.

find DIR -name "*.*" -type f -printf "%f %s\n" | awk ' END' 

Похожие вопросы