У меня есть огромное количество небольших файлов в сложной иерархии папок; они занимают слишком много места (т.е. терабайты). Я хотел бы узнать, какой тип файла (т.е., .pdf и т.д.) поднимает всю комнату так, чтобы я мог рассмотреть удаление всех файлов того типа.
Существует ли команда/сценарий удара, которая решила бы это для меня легко? Сценарий Python также был бы осуществим, но у меня нет gui.
Спасибо! Alex
Это кажется релевантным: https://stackoverflow.com/questions/1358920/bash-measure-disk-space-of-certain-file-types-in-aggregate
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]
Теперь, все, что необходимо сделать, создают словарь, отображающий расширения накопленного размера файла, и распечатывают словарь (возможно, после сортировки или чего-то).
Надежда это помогает.
Я просто записал это приблизительно за 5 минут. Вместо os.path.getsize я использую st_size os.stat. Я не думаю, что это действительно имеет значение. Я использую os.walk для рекурсивного "хождения" через все каталоги в текущем рабочем директоре '.', который это не было записано для эффективности или производительности в памяти, только для получения чего-то движение. Конечным результатом является словарь, заполненный расширениями файла для ключей, и каждое значение преобразовывается в строку, представляющую человекочитаемый формат общего размера для каждого типа файла. Я взял метод, записанный кем-то еще, чтобы сделать человеческое форматирование. Последняя часть является некоторым воображением smancy для сортировки типов файлов по размеру. При ударе 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
Решение для оболочки/простофили:
найдите: Распечатайте имя файла и размер для всех файлов
простофиля: Создайте Массив Помощника с помощью типа в качестве ключевого и размера, которому подводят итог, как значение. В конце входа: размер печати для всех типов.
find DIR -name "*.*" -type f -printf "%f %s\n" | awk '{sub(/.*\./,"",$1);count[$1]+=$2} END{for (var in count) print var, count[var];}'