Wie finde ich heraus, welcher Dateityp den meisten Speicherplatz belegt?

1893
Community

Ich habe eine Million kleine Dateien in einer komplexen Ordnerhierarchie; Diese belegen zu viel Speicherplatz (Terabytes). Ich möchte herausfinden, welcher Dateityp (z. B. .pdf usw.) den gesamten Speicherplatz beansprucht, sodass ich in Betracht ziehen kann, alle Dateien dieses Typs zu löschen.

Gibt es ein Bash-Kommando / Skript, das dies für mich leicht lösen könnte? Ein Python-Skript wäre auch funktionsfähig, aber ich habe keine GUI.

Vielen Dank! Alex

Dies scheint relevant zu sein: https://stackoverflow.com/questions/1358920/bash-measure-disk-space-of-certain-file-types-in-aggregate

0

3 Antworten auf die Frage

1
phimuemue

Quicktut:

Alle Dateien in einem Verzeichnis auflisten:

import os path="C:\\somedirectory" # insert the path to the directory of interest dirList=os.listdir(path) for fname in dirList: print fname 

Sie müssen das obige rekursiv machen, damit es auch in Unterordnern funktioniert.

Dateigröße einer Datei abrufen:

import os b= os.path.getsize("/path/isa_005.mp3") 

Dateierweiterung abrufen:

import os ext = os.path.splitext(file_name)[1] 

Jetzt müssen Sie lediglich ein Wörterbuch erstellen, das Erweiterungen für die angehäufte Dateigröße erstellt und das Wörterbuch (möglicherweise nach dem Sortieren oder etwas anderem) ausdrucken kann.

Ich hoffe es hilft.

0

Ich habe das gerade in 5 Minuten geschrieben. Anstelle von os.path.getsize verwende ich st.size von os.stat. Ich glaube nicht, dass es wirklich wichtig ist. Ich verwende os.walk, um rekursiv durch alle Verzeichnisse des aktuellen Arbeitsdirektors zu laufen. Dies wurde nicht für Effizienz oder Leistung geschrieben, nur um etwas in Gang zu setzen. Das Endergebnis ist ein Wörterbuch, das mit Dateierweiterungen für Schlüssel gefüllt ist. Jeder Wert wird in eine Zeichenfolge konvertiert, die ein vom Menschen lesbares Format der Gesamtgröße für jeden Dateityp darstellt. Ich nahm eine Methode, die von jemand anderem geschrieben wurde, um die menschliche Formatierung vorzunehmen. Der letzte Teil ist etwas ausgefallenes, um die Dateitypen nach Größe zu sortieren. Wenn Sie die Tastenkombination Strg + C drücken, wird die "Größenanpassung" abgebrochen, und es werden nur die Ergebnisse ausgedruckt, für die Sie Zeit hatten. Ziemlich spaßig! Danke für die Fahrt, viel Spaß.

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

Ergebnis:

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

Eine Shell / Gawk-Lösung:

find: Druckt Dateiname und Größe für alle Dateien

gawk: Erstellen Sie ein Assoc-Array mit type als Schlüssel und summierter Größe als Wert. Am Ende der Eingabe: Druckgröße für alle Typen.

find DIR -name "*.*" -type f -printf "%f %s\n" | awk ' END'