Hm. La respuesta de Nadia está más cerca de lo que significa preguntar; Sin embargo, para encontrar el (único) archivo más antiguo de un árbol, intente esto:
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 pequeña modificación, puede obtener los n
archivos más antiguos (similar a la respuesta de 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)
Tenga en cuenta que utilizando el método .endswith
permite realizar llamadas como:
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
para seleccionar más de una extensión.
Por último, si quieres ver la lista completa de los archivos, ordenados por fecha de modificación, con el fin de eliminar a todos los que se requiere para liberar espacio, aquí hay un código:
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)
y observe que el reverse=True
trae la archivos más antiguos al final de la lista, de modo que para el siguiente archivo para eliminar, simplemente haga un file_list.pop()
.
Por cierto, para una solución completa a su problema, ya que se están ejecutando en Linux, donde el os.statvfs
está disponible, puede hacerlo:
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
son los bloques libres del dispositivo y statvfs.f_bsize
es el tamaño de bloque. Tomamos los statvfs rootfolder
, así que tenga en cuenta los enlaces simbólicos que apuntan a otros dispositivos, donde podríamos eliminar muchos archivos sin liberar espacio en este dispositivo.
ACTUALIZACIÓN (copiando un comentario de Juan):
Dependiendo de la implementación del sistema operativo y el sistema de archivos, es posible que desee multiplicar por f_bfree f_frsize en lugar de f_bsize. En algunas implementaciones, este último es el tamaño de solicitud de E/S preferido. Por ejemplo, en un sistema FreeBSD 9 que acabo de probar, f_frsize era 4096 y f_bsize era 16384. POSIX dice que los campos de conteo de bloques están "en unidades de f_frsize" (ver http://pubs.opengroup.org/onlinepubs/9699919799//basedefs/sys_statvfs.h.html)
Espera, ¿cómo estás usando du para obtener espacio libre? Eso solo le dice al uso AFAIK. –
Lo siento, significó dh not du. –
¿Seguro que no es df? : P –