SkayaWiki
1. Écrire un programme qui fait la liste des fichiers (pas les répertoires!) présents dans le compte de l'utilisateur (répertoire et sous-répertoires).
(Et qui affiche la liste, avec un nom par ligne ; exactement comme la commande find ~)
2. Indiquer le nombre de fichiers et le nombre de répertoires.
(Comme si on exécutait la commande find ~ -type f | wc -l ; find ~ -type d | wc -l)
3. Indiquer le nombre de fichiers, le nombre de répertoires, et le nombre de liens symboliques.
(Si il y a un lien toto qui pointe vers le répertoire truc, alors toto compte uniquement comme un lien symbolique -- pas comme un répertoire ; et il ne faut pas descendre dans ses sous-répertoires.)
4. Indiquer les mêmes nombres, mais en différenciant les éléments « publics » et les éléments « privés ». Un fichier est considéré comme « privé » si le groupe propriétaire et les autres utilisateurs n'ont aucun droit dessus ; sinon il est public.
Rappel : pour consulter les informations (taille, droits...) d'un fichier :
struct_stat=os.stat(chemin_du_fichier)
print struct_stat.st_size
print struct_stat.st_mode
Pour vérifier qu'on est propriétaire d'un fichier : utiliser le champ st_uid et la fonction os.getuid.
5. Écrire un programme qui sauve la liste des fichiers dans ~/.pyndexer/list (créer le répertoire si nécessaire, et écraser l'ancienne liste si elle existe). On appellera ce premier programme pyndexer_mklist.py (pour le format de la liste : on pourra prendre par exemple un nom de fichier par ligne, ou bien les séparer avec des \0, ou encore utiliser pickle comme vu en cours).
6. Écrire un programme, pyndexer_locate.py, qui lira la liste stockée de le fichier évoqué ci-dessus, et cherchera dedans le(s) fichier(s) dont le nom contient toutes les chaînes spécifiées sur la ligne de commande.
Exemple : pyndexer_locate.py mp3 pink floyd doit afficher tous les noms (avec le chemin) des fichiers dont le nom contient "mp3", "pink" et "floyd" (dans n'importe quel ordre).
6bis. Implémenter deux méthodes pour le programe "locate" : l'une utilisant des regex, l'autre non ; et comparer la vitesse d'exécution (utiliser pour celà la commande shell time). Réfléchir aux possibilités d'optimisation...
7. Écrire un autre programme, pyndexer_mkmeta.py, qui va parcourir la liste générée par pyndexer_mklist.py, et si un fichier s'appelle .java, .c, .txt, .html (allonger la liste des extensions si nécessaire afin d'englober un maximum de fichiers texte), on va le découper en tokens (prendre comme séparateur tous les caractères non-alphanumériques), et créer un index primitif, sous la forme d'une table de hachage dont les clés seront les tokens (=mots) et les valeurs seront une liste de fichiers contenant le mot. Par exemple, pour les deux fichiers:
toto (contenant une seule ligne : 1+1=4)
titi (contenant une seule ligne : 4 quarts)
On aura la table de hachage : {"1": ["toto"], "4": ["toto", "titi"], "quarts": ["titi"]}
Une fois générée, cette table sera sauvée dans ~/.pyndexer/meta (utiliser le format qui vous semblera le plus pratique!)
8. Écrire un dernier programme, pyndexer_search.py, qui chargera le fichier "meta" et indiquera tous les fichiers contenant tous les mots contenus sur la ligne de commande.
Exemple : pyndexer_search.py class ray surface square doit donner le nom de tous les fichiers qui contiennent tous les mots "class", "ray", "surface" et "square" n'importe où dans le fichier (peu importe dans quel ordre).
9. Modifier mkmeta pour indexer les documents openoffice (en utilisant le module zip). On ne se préoccupera pas d'éliminer les balises XML.
10. Modifier encore mkmeta pour, cette fois-ci, essayer d'éliminer les balises XML.