Hm. La risposta di Nadia è più vicina a ciò che voi significava chiedere; tuttavia, per trovare il (singolo) più vecchio file in un albero, provate questo:
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)
Con una piccola modifica, è possibile ottenere i n
file più vecchi (simile alla risposta di Nadia):
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)
si noti che utilizzando il metodo .endswith
permette di chiamare come:
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
per selezionare più di un'estensione.
Infine, se si desidera che l'elenco completo dei file, in ordine di data di modifica, al fine di eliminare il maggior numero richiesto per lo spazio libero, ecco qualche codice:
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)
e notare che il reverse=True
porta il file più vecchi alla fine dell'elenco, in modo che per il prossimo file da eliminare, basta fare un file_list.pop()
.
Tra l'altro, per una soluzione completa al problema in questione, dal momento che è in esecuzione su Linux, dove il os.statvfs
è disponibile, si può fare:
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
sono i blocchi liberi del dispositivo e statvfs.f_bsize
è il misura del blocco. Prendiamo le statvfs rootfolder
, quindi fai attenzione ai collegamenti simbolici che puntano ad altri dispositivi, dove potremmo eliminare molti file senza liberare spazio in questo dispositivo.
UPDATE (la copia di un commento di Juan):
seconda dell'implementazione sistema operativo e file system, si consiglia di moltiplicare f_bfree da f_frsize piuttosto che f_bsize. In alcune implementazioni, quest'ultima è la dimensione richiesta di I/O preferita. Ad esempio, su un sistema FreeBSD 9 Ho appena testato, f_frsize erano 4096 e f_bsize era 16384. POSIX dice che i campi di conteggio del blocco sono "in unità di f_frsize" (vedi http://pubs.opengroup.org/onlinepubs/9699919799//basedefs/sys_statvfs.h.html)
Aspettare come si usa du per ottenere lo spazio libero? Questo dice solo l'uso di AFAIK. –
Mi spiace, intendevo dh non du. –
Sicuro che non sia df? : P –