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

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

Спасибо! Alex

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

3 ответа3

1

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 '{sub(/.*\./,"",$1);count[$1]+=$2} END{for (var in count) print var, count[var];}'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .