Hm. La réponse de Nadia est plus proche de ce que vous appelez ; cependant, pour trouver le (seul) fichier le plus ancien dans un arbre, essayez ceci:
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)
Avec une petite modification, vous pouvez obtenir les fichiers les plus anciens n
(similaire à la réponse 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)
Notez que l'utilisation de la méthode .endswith
permet d'appeler comme:
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
pour sélectionner plus d'une extension.
Enfin, si vous voulez la liste complète des fichiers, commandés par date de modification, afin de supprimer autant que nécessaire à l'espace libre, voici un 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)
et notez que le reverse=True
apporte la fichiers les plus anciens à la fin de la liste, de sorte que pour le prochain fichier à supprimer, vous faites juste un file_list.pop()
.
Par ailleurs, une solution complète à votre question, puisque vous exécutez sur Linux, où le os.statvfs
est disponible, vous pouvez le faire:
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
sont les périphériques blocs libres et statvfs.f_bsize
est la taille de bloc. Nous prenons le rootfolder
statvfs, donc attention aux liens symboliques pointant vers d'autres périphériques, où nous pourrions supprimer beaucoup de fichiers sans réellement libérer de l'espace dans cet appareil.
UPDATE (la copie d'un commentaire par Juan):
En fonction du système d'exploitation et la mise en œuvre le système de fichiers, vous voudrez peut-être multiplier par f_bfree f_frsize plutôt que f_bsize. Dans certaines implémentations, cette dernière est la taille de requête d'E/S préférée. Par exemple, sur un système FreeBSD 9 Je viens de tester, f_frsize était 4096 et f_bsize était 16384. Posix dit les champs de comptage de blocs sont « en unités de f_frsize » (voir http://pubs.opengroup.org/onlinepubs/9699919799//basedefs/sys_statvfs.h.html)
Attendez-vous comment utilisez-vous pour obtenir de l'espace libre? Cela ne dit que l'usage AFAIK. –
Désolé, cela signifiait dh pas du. –
Vous êtes sûr que ce n'est pas df? : P –