Haikson

[ Everything is possible. Everything takes time. ]

Поиск больших файлов < python >

Сегодня в конец доканало то, что на диске C: не хватает места, хотя использую 128GB SSD. Программы все устанавливаю на другой диск, перенес рабочий стол, документы... Короче сделал всё, чтобы системный диск не засрался. Но ничего не помогло. В итоге на нем осталось всего 30MB свободного места.

В поисках решения нашел скрипт (спасибо автору), который ищет файлы больше определенного размера на диске и выводит в консоль список. Проблема была в том, что скрипт написан под Python 3. Ну и неудобство в том, что вывод осуществлялся в консоль. Оттуда путь к ненужному файлу не скопируешь и в проводник не вставишь. Именно поэтому представляю всем "нуждающимся" доработанную версию данного скрипта. Тестировалось под Python 2.7.3. Вывод сохраняется в файле CleanDiskFound.txt рядом со скриптом.

from __future__ import print_function
import os
from errno import EACCES, EPERM, ENOENT

class CleanDiskC:

    total=0;
    countFiles=0;
    countFolders=0;
    fileNotFoundError=list()
    permissionError=list()
    files=list()

    found_str = "%s || %s\n"

    def __init__(self, bigSize=50, state=True):
        self.found = open("CleanDiskFound.txt", "w")
        self.bigSize=bigSize
        self.stateless=state

    def print_error_message(self, e, file_name):
        #PermissionError
        if e.errno==EPERM or e.errno==EACCES:
            print("PermissionError error({0}): {1} for:\n{2}".format(e.errno, e.strerror, file_name))
            if self.stateless:
                print("no access to folder: "+file_name)
            else:
                self.permissionError.append(file_name)
        #FileNotFoundError
        elif e.errno==ENOENT:
            print("FileNotFoundError error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
            if self.stateless:
                print("folder doesn\"t exist: "+file_name)
            else:
                self.fileNotFoundError.append(file_name)
        elif IOError:
            print("I/O error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
        elif OSError:
            print("OS error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))

    def printRow(self, size, path):
        size=str(size)+"Mb"
        while(len(size)<8):
            size+=" "
        print("|| "+size+"|| "+path)
        self.found.write(self.found_str % (path, size))
    
    def findBigFiles(self, path):
        if not self.stateless:
            print ("Progress: |", end="")
        self.searchBigFiles(path)       
        if not self.stateless:
            if len(self.fileNotFoundError)>0:
                print("\n\nCan\"t find files:")
                print("----------------------------")
                for elem in self.fileNotFoundError:
                    print(elem)
                print("----------------------------")
                print("Total: "+str(len(self.fileNotFoundError))+" elements\n")
            if len(self.permissionError)>0:
                print("\n\nDon\"t have pernission to access folder:")
                print("----------------------------")
                for elem in self.permissionError:
                    print(elem)
                print("----------------------------")
                print("Total: "+str(len(self.permissionError))+" folders\n")
            print("\nFiles with size more then "+str(self.bigSize)+"Mb:")
            print("----------------------------")
            self.files.sort(key=lambda x: x["size"], reverse=True)
            for elem in self.files:
                self.printRow(elem["size"], elem["path"])
        print("----------------------------")
        print("Total big files store: "+str(round(self.total/1024,1))+"Gb")
        print("Total cheched: "+str(self.countFiles)+" files")
        print("Total checked: "+str(self.countFolders)+" folders")
        self.found.close()
            
        
    def searchBigFiles(self, path):
        self.countFolders+=1        
        try:
            folder=os.listdir(path)
            if path=="\\":
                path=""
            for element in folder:
                if os.path.isfile(path+"\\"+element):
                    self.countFiles+=1
                    if not self.stateless:
                        if self.countFiles%10000==0:
                            print(str(self.countFiles)+"|",end="")
                    statinfo=os.stat(path+"\\"+element)
                    if(statinfo.st_size>1024*1024*self.bigSize):
                        size=round(statinfo.st_size/(1024*1024),1)
                        self.total+=size
                        if self.stateless:
                            self.printRow(size, path+"\\"+element)
                        else:
                            self.files.append({"size":size, "path":path+"\\"+element})
                elif os.path.isdir(path+"\\"+element):           
                        self.searchBigFiles(path+"\\"+element)
        except (IOError, OSError) as e:
            self.print_error_message(e,path)

#bigSize: default=50Mb
#stateless: default=True
            
do=CleanDiskC(50, False)
do.findBigFiles("\\")

далее следует разместить скрипт в корень диска и запустить:

python cleandisk.py