Trouver le fichier le plus ancien (récursivement) dans un répertoire
Je suis en train d'écrire un Python script de sauvegarde et j'ai besoin de trouver le plus ancien fichier dans un répertoire (et ses sous-répertoires). J'ai aussi besoin de filtre à *.les fichiers avi.
Le script sera toujours en cours d'exécution sur une machine Linux. Est-il possible de le faire en Python ou en serait l'exécution de certaines commandes shell de mieux?
Pour le moment, je suis en cours d'exécution df
pour obtenir l'espace libre sur une partition particulière, et si il y a moins de 5 go d'espace libre, je veux commencer la suppression de la plus ancienne *.avi
fichiers jusqu'à ce que cette condition est remplie.
source d'informationauteur Rowan Parker
Vous devez vous connecter pour publier un commentaire.
Hm. Nadia la réponse est plus proche de ce que vous signifiait demander; cependant, pour trouver le (seul) fichier le plus ancien, dans un arbre, essayez ceci:
Avec un peu de modification, vous pouvez obtenir le
n
fichiers les plus anciens (similaire à Nadia la réponse):Notez que l'utilisation de la
.endswith
méthode permet de faire des appels comme:pour sélectionner plus d'une extension.
Enfin, si vous voulez la liste complète des fichiers, triés par date de modification, afin de supprimer autant que nécessaire pour libérer de l'espace, voici un code:
et note que le
reverse=True
apporte les fichiers les plus anciens à la fin de la liste, de sorte que le prochain fichier à supprimer, il suffit de le faire unefile_list.pop()
.Par la manière, pour une solution complète à votre question, puisque vous êtes en cours d'exécution sur Linux, où le
os.statvfs
est disponible, vous pouvez le faire:statvfs.f_bfree
sont l'appareil de blocs libres etstatvfs.f_bsize
est la taille de bloc. Nous prenons lerootfolder
statvfs, de sorte que l'esprit les liens symboliques qui pointent vers d'autres appareils, où nous avons pu supprimer de nombreux fichiers sans vraiment de libérer de la place dans ce dispositif.Mise à JOUR (copie d'un commentaire par Juan):
En fonction de l'OS et de la mise en œuvre du système de fichiers, vous pouvez multiplier f_bfree par f_frsize plutôt que f_bsize. Dans certaines implémentations, le dernier est le préféré d'e/S taille de la demande. Par exemple, sur un système FreeBSD 9 je viens de tester, f_frsize était 4096 et f_bsize était 16384. POSIX indique le nombre de blocs champs sont "dans les unités de f_frsize" ( voir http://pubs.opengroup.org/onlinepubs/9699919799//basedefs/sys_statvfs.h.html )
De le faire en Python, vous pouvez utiliser
os.à pied(chemin)
à la parcourir récursivement les fichiers, et last_size
etst_mtime
attributs deos.stat(nom de fichier)
pour obtenir la taille des fichiers et des moments de modification.Vous pouvez utiliser stat et fnmatch modules ensemble pour trouver les fichiers
ST_MTIME référence à la date de dernière modification. Vous pouvez choisir une autre valeur si vous souhaitez
Vous pouvez commander la liste par le temps et les supprimer selon lui.
Je pense que la meilleure façon de le faire serait d'utiliser trouver avec ls -t (trier les fichiers par le temps).
quelque chose le long de ces lignes devrait faire l'affaire (supprime la plus ancienne avi fichier sous le répertoire spécifié)
étape par étape....
find /-name "*.avi" - trouver tous les fichiers avi de manière récursive à partir de la racine du répertoire
xargs-ls -t - trier tous les fichiers par date de modification, à partir de la plus récente à la plus ancienne.
tail-n 1 - récupérer le dernier fichier dans la liste (la plus ancienne)
xargs rm et l'enlever
Voici un autre Python formulation, un peu de la vieille école, par rapport à certains autres, mais il est facile à modifier, et traite le cas de l'absence de correspondance des fichiers sans lever d'exception.
Découvrez les commande linux
trouver
.Sinon, ce post tuyaux ensemble de ls et de la queue de supprimer le plus ancien fichier dans un répertoire. Qui peut être fait dans une boucle alors qu'il n'y a pas suffisamment d'espace libre.
Pour référence, voici le code carapace qui le fait (suivez le lien pour plus de solutions de rechange et une discussion):
La module os fournit les fonctions dont vous avez besoin pour obtenir des listes de répertoire et de fichier info en Python. J'ai trouvé os.pied être particulièrement utile pour la marche des répertoires de manière récursive, et os.stat va vous donner des informations détaillées (y compris la modification du temps) sur chaque entrée.
Vous pouvez être en mesure de le faire plus facilement avec une simple commande shell. Si cela fonctionne mieux pour vous ou pas dépend de ce que vous voulez faire avec les résultats.