Hm. Nadias Antwort ist näher an dem, was Sie zu fragen; jedoch in einem Baum die (einzige) älteste Datei für die Suche, versuchen Sie dies:
import os
def oldest_file_in_tree(rootfolder, extension=".avi"):
return min(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
Mit einer wenig Änderung, können Sie die n
ältesten Dateien (ähnlich Nadia Antwort) erhalten:
import os, heapq
def oldest_files_in_tree(rootfolder, count=1, extension=".avi"):
return heapq.nsmallest(count,
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
beachten Sie, dass die .endswith
Methode ermöglicht Anrufe als:
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
auf mehr als eine Erweiterung auswählen.
Schließlich sollten Sie die vollständige Liste der Dateien, nach Änderungszeit bestellt wollen, um so viele zu löschen, um Speicherplatz freizugeben erforderlich, hier ist etwas Code:
import os
def files_to_delete(rootfolder, extension=".avi"):
return sorted(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime),
reverse=True)
und beachten Sie, dass die reverse=True
das bringt ältesten Dateien am Ende der Liste, so dass für die nächste Datei zu löschen, tun Sie einfach eine file_list.pop()
.
By the way, für eine komplette Lösung für Ihr Problem, da Sie unter Linux ausgeführt werden, wo die os.statvfs
verfügbar ist, können Sie tun:
import os
def free_space_up_to(free_bytes_required, rootfolder, extension=".avi"):
file_list= files_to_delete(rootfolder, extension)
while file_list:
statv= os.statvfs(rootfolder)
if statv.f_bfree*statv.f_bsize >= free_bytes_required:
break
os.remove(file_list.pop())
statvfs.f_bfree
die freien Blöcke Gerät sind und statvfs.f_bsize
ist die Block Größe. Wir nehmen die rootfolder
Statvfs, also beachten Sie symbolische Links, die auf andere Geräte zeigen, wo wir viele Dateien löschen könnten, ohne tatsächlich Speicherplatz auf diesem Gerät freizugeben.
UPDATE (Kopieren Kommentar von Juan):
auf das Betriebssystem und Dateisystem-Implementierung abhängig, können Sie f_bfree von f_frsize vermehren wollen, anstatt f_bsize. In einigen Implementierungen ist letzteres die bevorzugte Größe der E/A-Anfrage. Zum Beispiel auf einem System FreeBSD 9 ich gerade getestet, war f_frsize 4096 und f_bsize war 16384. POSIX sagt der Blockanzahl Felder „in Einheiten von f_frsize“ sind (siehe http://pubs.opengroup.org/onlinepubs/9699919799//basedefs/sys_statvfs.h.html)
Warte, wie verwendest du du, um freien Speicherplatz zu bekommen? Das sagt nur Verwendung AFAIK. –
Sorry, gemeint ist nicht du. –
Bist du sicher, dass es nicht df ist? : P –