Scrip Perl de suppr de fichiers indésirables [Résolu/Fermé]

Signaler
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
-
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
-
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 à
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.

5 réponses

Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
9
Petit up
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
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 ?
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";  
} 
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
9
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 :

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
foreach
avec des
if
mais cela ne fonctionne pas apparemment.

J'ai bien l'affichage de mes fichiers avec mon listage précédent, mais pas avec le
foreach
qui 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
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
9
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
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.
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
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 ^^
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
9
Ah x), effectivement ca a moins de chance de fonctionner :p
J'ai enlevé le return, mais toujours le meme résultat, je me permets de t'envoyer mon code en mp.
Merci.
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
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
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
9
Ok, je regarde tout ça, merci.
Messages postés
83
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
26 juillet 2011
9
Parfait, merci beaucoup Leviathan49.

Mon topic était plus général, mais ça m'a bien décoincé.

Je posterais d'autres messages spécifiques aux autres étapes au besoin.

Encore merci et une bonne continuation à toi.