Seite 1 von 1

quota.py - Große Dateien finden...

Verfasst: Montag 3. Juli 2006, 10:36
von jens
Hier ein kleines Skript, um die größten Dateien zu finden:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: cp1252 -*-

__author__  = "Jens Diemer"
__license__ = """GNU General Public License v2 or above
http://www.opensource.org/licenses/gpl-license.php"""
__url__     = "http://www.jensdiemer.de"

__version__ = "v0.1"

__info__ = """quota.py (%s) - finding your biggest files ;)""" % __version__

import sys, os, fnmatch, time, optparse

usage = "%prog [options]"

# Encoding des Dateisystems herausfinden
fs_encoding = sys.getfilesystemencoding()



def filesizeformat(i):
    """
    Taken from jinja
    Format the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB,
    102 bytes, etc).
    """
    bytes = float(i)
    if bytes < 1024:
        return u"%d Byte%s" % (bytes, bytes != 1 and u's' or u'')
    if bytes < 1024 * 1024:
        return u"%.1f KB" % (bytes / 1024)
    if bytes < 1024 * 1024 * 1024:
        return u"%.1f MB" % (bytes / (1024 * 1024))
    return u"%.1f GB" % (bytes / (1024 * 1024 * 1024))



class Quota:

    def __init__(self, min_size):
        self.min_size = min_size * 1024 * 1024
        print "Display all files who are bigger than %s" % (
            filesizeformat(self.min_size)
        )

        self.total_size=0
        self.total_file_count=0
        self.total_dir_count=0

        self.old_time = time.time()

    def scan(self, path):
        print
        print "scan [%s]..." % path
        print
        os.path.walk(path, self.path_walk, "")
        print "\r", " "*79
        self.print_status_line()
        print

    def path_walk(self, arg, current_dir, FileNames):
        for file_name in FileNames:
            abs_file=os.path.join(current_dir, file_name)
            if os.path.isdir(abs_file):
                self.total_dir_count+=1
                continue

            self.total_file_count+=1

            if os.path.isfile(abs_file):
                bytes=os.stat(abs_file)[6]
                self.total_size += bytes

                if bytes > self.min_size:
                    abs_file = unicode(abs_file, fs_encoding, "replace")

                    if len(abs_file)>70:
                        abs_file = "%s...%s" % (abs_file[:20], abs_file[-55:])

                    print "\r%9s - %s" % (
                        filesizeformat(bytes), abs_file
                    )
                    self.print_status_line()

            #~ else:
                #~ print "skip '%s'" % abs_file

            if time.time()-self.old_time > 1:
                self.print_status_line()

    def print_status_line(self):
        sys.stdout.write(
            "\r%s total size - %s files scanned." % (
                filesizeformat(self.total_size), self.total_file_count
            )
        )
        sys.stdout.flush()
        self.old_time = time.time()


    def print_total_stat(self):
        print
        print "total dir count....:", self.total_dir_count
        print "total file count...:", self.total_file_count
        print "total size.........:", filesizeformat(self.total_size)
        print






def main():
    """
    Hauptprog.
    """
    print "_"*79
    print __info__
    print

    parser = optparse.OptionParser(usage=usage)

    parser.add_option("-p", "--path",
        dest="path",
        default=".",
        action="store",
        help="basepath to scan (default: '.')"
    )
    parser.add_option("-s", "--size",
        dest="size",
        default=5,
        type = int,
        action="store",
        help=(
            "size limit in MB"
            " - Display all files who are bigger."
            " (Default: 5MB)"
        )
    )

    (options, args) = parser.parse_args()

    q = Quota(options.size)
    q.scan(options.path)
    q.print_total_stat()


if __name__ == '__main__':
    main()

Re: quota.py - Große Dateien finden...

Verfasst: Montag 3. Juli 2006, 11:42
von gerold
jens hat geschrieben:Hier ein kleines Skript, um die größten Dateien zu finden
Hi Jens!

Nur zur Ergänzung. Bitte nicht falsch verstehen.

http://gerold.bcom.at/kleiner_computerk ... n_dateien/

lg
Gerold
:-)

Re: quota.py - Große Dateien finden...

Verfasst: Montag 3. Juli 2006, 11:44
von jens
Auch nett, nur eine Zeile... Aber, lass das mal auf einer Umfangreichen Festplatte laufen... Dann hat man auch wie bei rsync, recht wenig Informationen über den "Programmablauf" :(

Bei meinem Skript sieht man jede Sekunde ein Lebenszeichen...

Re: quota.py - Große Dateien finden...

Verfasst: Montag 3. Juli 2006, 11:58
von gerold
jens hat geschrieben:Dann hat man auch wie bei rsync, recht wenig Informationen über den "Programmablauf"
Hi Jens!

rsync kennt den Parameter "--progress". Damit bekommst du sogar einen Balken, der dir anzeigt wie weit es mit dem Übertragen schon ist.

Dieser Parameter ist allerdings für Skripte mit Logging ungeeignet, da ansonsten jede Änderung in die Logdatei geschrieben wird.

lg
Gerold
:-)

Verfasst: Montag 3. Juli 2006, 12:20
von jens
Ne, also "--progress" ist ganau das was ich nicht möchte... Jede Datei wird aufgelistet :( Das ist bei vielen kleinen Dateien zu lahm. Macht also nur bei wenigen großen Dateien Sinn...

Kennen Linux Programmierer nicht "\r" ??? :roll:

Verfasst: Montag 3. Juli 2006, 16:55
von BlackJack
jens hat geschrieben:Kennen Linux Programmierer nicht "\r" ??? :roll:
Doch natürlich, das ist das Zeichenkettenliteral für den Wagenrücklauf. ;-)

Verfasst: Donnerstag 13. Juli 2006, 20:21
von CM
off-topic:
Hoi Gerold,
Bookmark gesetzt und Deinen Einzeiler für verdammt praktisch befunden ;-)
Gruß,
Christian