Trier des fichiers

Résolu/Fermé
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 - 30 mai 2014 à 09:27
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 juin 2014 à 09:53
Bonjour à tous,

Je vous expose mon problème, j'aimerais mettre en place une routine permettant d'effectuer un tri sur des fichiers. Plus précisément, je voudrais qu'à partir de l'endroit ou je lance le programme il descende dans l'arborescence et pour chaque fichier, en fonction de son extension une règle est appliquée, exemple: photo non consulté depuis plus de 2 ans le déplacé vers un DD externe. Est-ce possible en C? J'avais commencé à essayé de regardé pour le faire en batch, mais je n'ai rien trouvé de bien convainquant.

Merci d'avance pour vos réponses :)

7 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 30/05/2014 à 20:21
'lut, en Python 3:
import os, time

year = 365*24*60*60
source = "/tmp/src"
dest = "/tmp/bak"

def backup(root, filename):
    os.makedirs(os.path.join(dest, root[len(source)+1:]), exist_ok=True)
    os.rename(os.path.join(root, filename), os.path.join(dest, root[len(source)+1:], filename))

for root, direc, filenames in os.walk(source):
    for filename in filenames:
        if filename.lower().endswith(('.ppt', '.pptx')):
            if time.time() - os.path.getatime(os.path.join(root, filename)) > 2*year:
                backup(root, filename)
        if filename.lower().endswith(('.jpg', '.avi')):
            if time.time() - os.path.getatime(os.path.join(root, filename)) > 3*year:
                backup(root, filename)

@fiddy: 18 lignes ;)
(et une redondance de code de fou: ça peut être beaucoup plus clean mais ça marche)
from human import idiocy
del idiocy
2
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
30 mai 2014 à 21:14
On ne compte pas les lignes vides (ni commentaires, etc.) mais les lignes de code
Du coup, ça fait 15 tout pile. Belle estimation n'est-ce pas ? :-p
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
2 juin 2014 à 09:11
Bonjour
pas mal comme code personnellement je ne suis pas trop à l'aise avec le python même si je trouve ce langage extrêmement puissant ceci dit c'est bien
à bientôt
0
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
Modifié par Elponito le 2/06/2014 à 11:21
Salut,

Je rencontre un problème lorsque je veux utiliser un lecteur différent, si je lance le code de gravgun sur C: je n'ai pas de problème, en revanche si je spécifie le chemin source = "E:/src" et la destination dest = "/tmp/bak" (sur C du coup), cela ne fonctionne pas, l'erreur est: "OSError: [WinError 17] Impossible de déplacer le fichier vers un lecteur de disque différent" (par contre si j'execute tout sur E cela marche niquel également) si vous avez une idée d'où ça peut venir :p
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
2 juin 2014 à 11:33
Bonjour
Personnellement je ne suis pas trop apte à pouvoir t'aider sur du python, le mieux est de poser directement la question à @gravgun, pour ce qui est du chemin je pense que le programme ne permet que d'explorer tous les sous-dossiers dans le quelle il est executé enfin (corrigé moi si je me trompe)
0
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
2 juin 2014 à 16:20
J'aurais encore une question de plus pour @gravgun, mon but serait de finir avec un interface graphique qui permet de gérer les règles de tri, en ajouter et les modifier, je pensais passer par une sérialisation des règles, j'aimerais juste savoir si tu pense que c'est faisable, histoire que je perde pas du temps pour rien, si jamais ce n'est pas le cas.. Merci d'avance pour la réponse
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 30/05/2014 à 19:49
En C, tu peux utiliser struct stat.
Par exemple :
struct stat buffer;
stat(nomFichier, &buffer);
printf("Date de dernier acces : %ld\n", buffer.st_atime); 

Pour afficher la date sous forme intelligible, tu peux utiliser les fonctions du header time.h.
Ensuite, il faudra que tu fasses une boucle pour parcourir tous les fichiers de ton disque, puis que tu mettes tout ceci dans une liste. Que tu tries la liste, etc. Si c'est juste pour te faire un petit outil, je le ferai plutôt en python.

En python, ça se fait très facilement. Probablement en 1 quinzaine de ligne :-). En C, plutôt 150...

Après, à toi de voir si le python te fait peur ou pas :-). Sachant que d'autres langages de script sont également possibles.

Google is your friend
1
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
30 mai 2014 à 12:04
Bonjour
C'est possible de le faire par programmation, pour cela il te faut utiliser la structure
struct stat 
pour connaitre les attributs de ton fichier comme, la date de la dernière modification/acces, le droit utilisateur/groupe etc
à bientôt
0
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
30 mai 2014 à 14:25
Merci pour la réponse je vais regarder cela :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 30/05/2014 à 16:36
Bonjour,

La bibliothèque standard du C ne permet pas de faire ça.
En revanche, en utilisant les fonctions propres à ton OS, cela devient possible.
Sur quel OS tu es ? Windows ?
Pourquoi ne pas le faire dans un autre langage ? Il y en a des beaucoup plus adaptés pour ce genre de tâches.
Cdlt,

Google is your friend
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
30 mai 2014 à 16:40
La cstdlib ne le permet pas, en effet, mais ça peut se faire indépendamment de l'OS vu que ce qu'il demande (liste de fichiers, vérif d'extension et de date) peut se faire avec opendir et la struct stat définies par le standard POSIX(.1-2001).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
30 mai 2014 à 17:44
cstdlib, ce n'est pas une bibliothèque mais un header. De plus ce n'est pas du C mais du C++.
Ensuite, même si beaucoup le sont, tous les OS ne sont pas full-compatible avec la norme POSIX.1-2001. Voilà pourquoi il faut toujours demander l'OS lorsqu'on est sur des fonctionnalités non standard ISO C89/90 ou C99...
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
30 mai 2014 à 17:55
Oui c'est juste que j'ai utilisé le nom "raccourci"... Quant au respect des standards, je sais. J'anticipais juste l'éventuelle option d'écrire du code spécifique a la plateforme (
OpenFile
ou
open
)
0
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
30 mai 2014 à 17:15
Merci pour vos réponse :)

En effet fiddy je suis sur Windows, pourquoi en C, car je ne sais pas dans quel autre langage le faire, mais si tu connais un langage plus adapté je suis preneur. Pour exposer un peux plus en détail mon problème, je suis actuellement en stage et l'on a un serveur de fichier sur lequel il y a certains fichiers qui n'ont pas lieu d'être, je doit donc mettre en place une routine, qui permet à partir de règle que j'ai définie de faire un tri sur les fichier. J'ai donc un poste sur lequel sera lancé la routine, le but est donc de parcourir l'arborescence en appliquant les règles, par exemple:

*.ppt: Si non consulté depuis plus de 2 ans -> déplacement vers une sauvegarde en locale

*.xsl: Ne pas toucher.

*.jpg: Si non consulté depuis plus de 3 ans -> déplacement vers une sauvegarde en locale

*.avi: Si non consulté depuis plus de 3 ans -> déplacement vers une sauvegarde en locale

voila en gros, je suis preneur de toutes vos idées car je sais pas trop ver quelle technologie me tourner...

Merci d'avance
0
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
30 mai 2014 à 23:06
Merci beaucoup pour ces réponses :) Je vais me pencher sur le python :)
0
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
Modifié par Elponito le 2/06/2014 à 10:34
Vous êtes trop top fiddy et gravgun, merci pour votre aide, cela me permet de découvrir un nouveau langage en plus :) je laisse le sujet ouvert, je posterais si je rencontre des difficultés, ce qui risque d'arriver puisque je découvre python :p
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
3 juin 2014 à 09:53
Nope. Sujet résolu. Ouvre plutôt un autre post si tu as des.questions en python (dans la catégorie du même nom.)
0