Scrip Perl de suppr de fichiers indésirables
Résolu
NMalo
Messages postés
83
Date d'inscription
Statut
Membre
Dernière intervention
-
NMalo Messages postés 83 Date d'inscription Statut Membre Dernière intervention -
NMalo Messages postés 83 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en stage et chargé de réaliser un script en Perl qui analyse tous les fichiers des répertoires des personnes sur un réseau informatique et supprime des fichiers selon certains critères.
Le soucis, c'est que j'ai beaucoup de mal avec la prog' ><
Le script en question doit aller dans les répertoires de différents utilisateurs (Linux Gentoo pour les PCs), rechercher les fichiers de façon récursive, leurs appliquer différents tests (vérifier que ceux-ci ne sont pas vides, respectent des règles de regex comme "Commencer par une majuscule, chaque espace doit être signalé par un _", que ceux-ci se trouvent au bon endroit (dans un dossier et non a la racine du répertoire), qu'ils n'aient pas de doublons (fichiers compressés / archivés et autres), etc, etc....).
J'ai choisi le Perl pour ses facultés avec les regex.
J'ai fixé le script en plusieurs partie : (qui peuvent être optimisées biensûr)
1ere étape : Recherche des fichiers récursivement dans un répertoire donnée donc
2eme étape : Envoi de la liste à l'étape 3
3eme étape : Effectuer plusieurs tests répondant au différents besoins
4eme étpe : Constitution d'une liste de tous les fichiers qui vont etre supprimés
5eme étape : Envoi de cette liste dans un fichier log d'un administrateur afin de conserver une trace
et enfin 6eme etape : Suppression des fichiers indésirables.
Dans l'idée tout se passe bien, mais dès que je lance "Padre" (IDE), plus rien ne sort, la programmation n'est pas mon fort, mais je n'ai pas le choix.
Pour le moment, seule la première étape est "valide", j'effectue une recherche récursive grâce à
Je souhaiterais envoyer ma liste "créée", "récupérée" afin d'appliquer mes différents tests avec des case, mais je n'y parviens pas.
Voilà ce que j'ai pour "l'envoi de ma liste vers mes tests" :
Je pense que la syntaxe est bonne, mais le résultat attendu n'est pas présent, j'ai déjà une fonction précédente qui m'affiche tous les fichiers trouvés dans le répertoire à "tester" avec leurs différents chemins précédemment, le print dans le foreach sert uniquement de tests.
J'ai testé en remplaçant par un tableau de hash, je n'ai pas du bien m'y prendre.
Pour la suite, j'ai récupéré un script de suppression et je ne pense pas que les tests devraient poser problème, mais si vous avez des indications / des bouts de codes, je vous en serais reconnaissant.
En tout cas, merci de m'avoir lu, excusez-moi pour ce pavé, qui je l'espère vous aura fourni les bonnes informations pour me tutorer.
Pardon, oublié de préciser, pour le moment, j'ai bien le premier affichage de tous les fichiers du répertoire avec leurs chemins, mais pas le second avec le foreach. (affichage qui ne sert que de test pour vérifier le fonctionnement du foreach). Merci.
Ou si vous avez un script en bash qui répondrait à cela, je suis preneur, mais l'utilisation de Sed et Awk m'a rebuté, de plus, les Regex Posix sont un peu moins puissantes que PCRE à ce que j'ai compris.
Je suis en stage et chargé de réaliser un script en Perl qui analyse tous les fichiers des répertoires des personnes sur un réseau informatique et supprime des fichiers selon certains critères.
Le soucis, c'est que j'ai beaucoup de mal avec la prog' ><
Le script en question doit aller dans les répertoires de différents utilisateurs (Linux Gentoo pour les PCs), rechercher les fichiers de façon récursive, leurs appliquer différents tests (vérifier que ceux-ci ne sont pas vides, respectent des règles de regex comme "Commencer par une majuscule, chaque espace doit être signalé par un _", que ceux-ci se trouvent au bon endroit (dans un dossier et non a la racine du répertoire), qu'ils n'aient pas de doublons (fichiers compressés / archivés et autres), etc, etc....).
J'ai choisi le Perl pour ses facultés avec les regex.
J'ai fixé le script en plusieurs partie : (qui peuvent être optimisées biensûr)
1ere étape : Recherche des fichiers récursivement dans un répertoire donnée donc
2eme étape : Envoi de la liste à l'étape 3
3eme étape : Effectuer plusieurs tests répondant au différents besoins
4eme étpe : Constitution d'une liste de tous les fichiers qui vont etre supprimés
5eme étape : Envoi de cette liste dans un fichier log d'un administrateur afin de conserver une trace
et enfin 6eme etape : Suppression des fichiers indésirables.
Dans l'idée tout se passe bien, mais dès que je lance "Padre" (IDE), plus rien ne sort, la programmation n'est pas mon fort, mais je n'ai pas le choix.
Pour le moment, seule la première étape est "valide", j'effectue une recherche récursive grâce à
File::Find::name, j'ajoute les résultats à une liste (en utilisant
File::Spec), puis je sèche complètement pour passer de l'étape 2 à l'étape 3.
Je souhaiterais envoyer ma liste "créée", "récupérée" afin d'appliquer mes différents tests avec des case, mais je n'y parviens pas.
Voilà ce que j'ai pour "l'envoi de ma liste vers mes tests" :
my @fichiers; #mon tableau de fichiers avec chemins my $fichier_rep; #ma variable de fichier que j'envoi dans mon tableau précédemment foreach my $fichier_rep ( @fichiers ) { print "$fichier_rep\n" or die "Ca ne marche pas\n"; }
Je pense que la syntaxe est bonne, mais le résultat attendu n'est pas présent, j'ai déjà une fonction précédente qui m'affiche tous les fichiers trouvés dans le répertoire à "tester" avec leurs différents chemins précédemment, le print dans le foreach sert uniquement de tests.
J'ai testé en remplaçant par un tableau de hash, je n'ai pas du bien m'y prendre.
Pour la suite, j'ai récupéré un script de suppression et je ne pense pas que les tests devraient poser problème, mais si vous avez des indications / des bouts de codes, je vous en serais reconnaissant.
En tout cas, merci de m'avoir lu, excusez-moi pour ce pavé, qui je l'espère vous aura fourni les bonnes informations pour me tutorer.
Pardon, oublié de préciser, pour le moment, j'ai bien le premier affichage de tous les fichiers du répertoire avec leurs chemins, mais pas le second avec le foreach. (affichage qui ne sert que de test pour vérifier le fonctionnement du foreach). Merci.
Ou si vous avez un script en bash qui répondrait à cela, je suis preneur, mais l'utilisation de Sed et Awk m'a rebuté, de plus, les Regex Posix sont un peu moins puissantes que PCRE à ce que j'ai compris.
A voir également:
- Scrip Perl de suppr de fichiers indésirables
- Explorateur de fichiers - Guide
- Impossible de supprimer un fichier - Guide
- Gestionnaire de fichiers - Télécharger - Gestion de fichiers
- Renommer des fichiers en masse - Guide
- Fichiers epub - Guide
5 réponses
Le script est juste sensé de renvoyer le contenu de ton tableau, c'est ça ?
Il marche parfaitement chez moi où est le problème exactement ?
Il marche parfaitement chez moi où est le problème exactement ?
use strict; my @fichiers = (1,2,3); #mon tableau de fichiers avec chemins foreach my $fichier_rep ( @fichiers ) { print "$fichier_rep\n" or die "Ca ne marche pas\n"; }
Bonjour, merci pour votre réponse en premier lieu.
Oui et non, cette partie de mon script est sensé me renvoyer le contenu de mon tableau précédemment généré, qui est composé de fichiers avec leurs chemins de différents répertoires d'un utilisateur.
Partie d'un exemple :
Je souhaite ensuite appliquer différents tests sur ces fichiers.
Je suis parti sur l'idée d'un
J'ai bien l'affichage de mes fichiers avec mon listage précédent, mais pas avec le
Si je ne suis pas assez explicite, n'hésitez pas à me le dire. Merci
Oui et non, cette partie de mon script est sensé me renvoyer le contenu de mon tableau précédemment généré, qui est composé de fichiers avec leurs chemins de différents répertoires d'un utilisateur.
Partie d'un exemple :
File::Find : /home/NMalo/Travail_en_cours/Scripts_Poo/Suppr_Bl.pl File::Find : /home/NMalo/Travail_en_cours/Scripts_Poo/Envoi_fichiers.pl File::Find : /home/NMalo/Travail_en_cours/Scripts_Poo/Envoi_Greylist.pl File::Find : /home/NMalo/Travail_en_cours/Scripts_Poo/Main_Script.pl File::Find : /home/NMalo/Travail_en_cours/Script_All/<gras>Tests.pl File::Find : /home/NMalo/Travail_en_cours/Script_All/<gras>Operative_script.pl File::Find : /home/NMalo/Travail_en_cours/Script_All/Script_liste_fichiers.pl File::Find : /home/NMalo/Travail_en_cours/Script_All/Scrip_
Je souhaite ensuite appliquer différents tests sur ces fichiers.
Je suis parti sur l'idée d'un
foreachavec des
ifmais cela ne fonctionne pas apparemment.
J'ai bien l'affichage de mes fichiers avec mon listage précédent, mais pas avec le
foreachqui suit (le print dans le foreach sert juste de vérification comme quoi la liste de fichiers est bien prise dans le
foreach)
Si je ne suis pas assez explicite, n'hésitez pas à me le dire. Merci
J'ai changé la liste (@fichiers) par (1,2,3), mon foreach m'effectue bien cetet fois les instructions dans celui-ci.
J'ai un return
Est-ce que cela régie l'utilisation d'un foreach ensuite?
Je résume :
Avec :
Je n'ai rien d'affichier.
Avec :
J'ai bien le message "Coucou" d'affichier.
J'ai un return
return @fichiers;juste avant.
Est-ce que cela régie l'utilisation d'un foreach ensuite?
Je résume :
Avec :
my (@fichiers); foreach my $fichier_rep ( @fichiers ) { print "Coucou\n" }
Je n'ai rien d'affichier.
Avec :
my (@fichiers); foreach my $fichier_rep ( @1,2,3 ) { print "Coucou\n" }
J'ai bien le message "Coucou" d'affichier.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu as un return avant ?!
Ta fonction arrête de s'exécuter après un return. Le code après n'est donc pas pris en compte.
Si ce n'est pas ce que tu voulais dire par "J'ai un return juste avant.", désolé, j'ai mal compris. Dans ce cas est-ce que tu pourrais mettre un peu plus de ton code ?
Sinon le tableau est peut être vide d'où la non exécution du foreach, là encore il me faudrait un peu plus de code ^^
Ta fonction arrête de s'exécuter après un return. Le code après n'est donc pas pris en compte.
Si ce n'est pas ce que tu voulais dire par "J'ai un return juste avant.", désolé, j'ai mal compris. Dans ce cas est-ce que tu pourrais mettre un peu plus de ton code ?
Sinon le tableau est peut être vide d'où la non exécution du foreach, là encore il me faudrait un peu plus de code ^^
Bon j'ai un peu évidé ton programme et il renvoie maintenant la même chose qu'un find /repertoire -type f.
Il cherche donc de façon recursive les fichiers contenus dans le dossier "repertoire" et les affiche avec chemin. Il y a même deux fois la même fonction dans ce que tu m'a envoyé.
Je t'envoie une version simplifiée de ton prog par mp puis ta version précédente un peu commenté un peu plus tard
Il cherche donc de façon recursive les fichiers contenus dans le dossier "repertoire" et les affiche avec chemin. Il y a même deux fois la même fonction dans ce que tu m'a envoyé.
Je t'envoie une version simplifiée de ton prog par mp puis ta version précédente un peu commenté un peu plus tard