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

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 3. Juli 2006, 10:36

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 3. Juli 2006, 11:42

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 3. Juli 2006, 11:44

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 3. Juli 2006, 11:58

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 3. Juli 2006, 12:20

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:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Montag 3. Juli 2006, 16:55

jens hat geschrieben:Kennen Linux Programmierer nicht "\r" ??? :roll:
Doch natürlich, das ist das Zeichenkettenliteral für den Wagenrücklauf. ;-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 13. Juli 2006, 20:21

off-topic:
Hoi Gerold,
Bookmark gesetzt und Deinen Einzeiler für verdammt praktisch befunden ;-)
Gruß,
Christian
Antworten