Ouvrir tous les fichiers dun dossier et check

Fermé
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 - Modifié par nikossss le 18/12/2010 à 15:20
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 21 déc. 2010 à 10:21
Bonjour,

En la période de noël j'espère une aide qui m'aiderai énormément.
Je ne sais pas si c'est la partie appropriée.

Voilà j'explique. J'ai un dossier, dedans des fichiers .ini . Ces fichiers ont 4 données dedans, présenté sous cette forme :
Pass=
Age=
Code=
Id=


J'aimerai connaître s'il existe un programme modifiable qui pourrait :

- Ouvrir le dossier
- Ouvrir tous les fichiers et check si le code est = 1 et l'id < 6
- Si le code est = 1 et l'id < 6 alors delete ce fichier.

Je ne m'y connaît pas vraiment mais avec une base ou un exemple je pourrais travailler dessus. Merci

20 réponses

KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
Modifié par KX le 18/12/2010 à 19:05
Voici un code Java qui devrait faire ce que tu veux (je l'ai testé mais il peut rester des cas particuliers non-traités)

Chaque classe Java doit être enregistrée dans un fichier portant le nom de la classe dans un même dossier. Il faudra ensuite les compiler !

// Champ.java

/**
 * Représente une ligne d'un fichier de configuration et sa valeur associée
 * @author KX
 */
public class Champ
{
    /** L'identifiant de la ligne, par exemple : "Id=" */
    public String matcher;
    /** La valeur associée à l'identifiant */
    public String valeur;
    
    /**
     * Créé le champ avec la valeur "" par défaut
     * @param matcher le préfixe qui identifie la ligne 
     */
    public Champ(String matcher)
    {
        this.matcher=matcher;
        this.valeur="";
    }
}

// Informations.java

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * Représente la succession de plusieurs champs d'un fichier de configuration
 * @author KX
 */
public class Informations extends ArrayList<Champ>
{
    private static final long serialVersionUID = 1L;

    /**
     * Valeurs des premiers champs d'un fichier
     * @param matcher les champs dans l'ordre où ils apparaissent dans le fichier (un par ligne)
     */
    public Informations(String...matcher)
    {
        clear();
        for (int i=0; i<matcher.length; i++)
            add(new Champ(matcher[i]));
    }
    
    /**
     * Pour chaque champ du fichier, on lit sa valeur.
     * @param fichier le fichier de configuration dont on lit les valeurs
     * @return true si tous les champs ont été trouvés, false sinon
     */
    public boolean lireValeurs(File fichier) 
    {
        Scanner sc;
        try
        {
            sc = new Scanner(fichier); // ouverture du fichier
        }
        catch (FileNotFoundException e)
        {
            return false;
        }
                
        for (int i=0; i<size(); i++)
        {
            if (!sc.hasNextLine())
                return false; // le fichier ne contient pas assez de champs
            
            String s=sc.nextLine(); // lecture de la ligne
            
            if (!s.startsWith(get(i).matcher))
                return false; // la ligne ne correspond pas au champ attendu
            
            get(i).valeur=s.replaceFirst(get(i).matcher,""); // on attribue la valeur au champ
        }
        
        sc.close(); // on ferme le fichier        
        return true;
    }
}

// Analyse.java

import java.io.File;
import java.util.ArrayList;

/**
 * Analyse un dossier et récupère tous les fichiers qui satisfont à la recherche
 * @author KX
 */
public class Analyse extends ArrayList<File>
{
    private static final long serialVersionUID = 1L;
    
    /**
     * Vérification de l'extension d'un fichier
     * @param fichier le fichier sur lequel on fait la vérification
     * @param extensions les extensions pour lesquelles le fichier doit être accepté
     * @return true si le fichier a l'une des extensions cherchées, false sinon
     */
    private boolean bonneExtension(File fichier,String...extensions)
    {
        String s1=fichier.getName();
        String s2=s1.substring(s1.lastIndexOf(".")+1,s1.length()); // l'extension du fichier
        for (String e : extensions) // on parcourt les différentes extensions
            if (e.equals(s2))
                    return true; // s'il y a coïncidence, c'est bon.
        return false;
    }
    
    /**
     * Recherche si un fichier doit être accepté par l'analyse
     * Dans notre cas, code est le troisième champ et doit valoir 1
     * id est le quatrième champ et doit être inférieur à 6
     * @param fichier le fichier considéré
     * @param inf les premiers champs que contient le fichier
     * @return true si le fichier contient bien les éléments de la recherche, false sinon
     */
    public boolean recherche(File fichier, Informations inf)
    {
        if (!inf.lireValeurs(fichier)) 
            return false; // le fichier n'a pas tous les champs
        try
        {
            int code = Integer.parseInt(inf.get(2).valeur);
            int id = Integer.parseInt(inf.get(3).valeur);
            return code==1 && id<6; // la recherche est correcte
        }
        catch (Exception e) 
        {
            return false; // les valeurs n'étaient pas entières ou inf ne contenait pas suffisamment de champs
        }
    }
    
    /**
     * Parcours un dossier pour relever tous les fichiers qui satisfont à la recherche
     * @param nomDossier le dossier où se trouve les fichiers
     * @param inf les différents champs qui doivent être utilisés pour la recherche
     * @param extensions les différentes extensions que peuvent prendre un fichier à analyser
     */
    public Analyse(String nomDossier, Informations inf, String...extensions)
    {
        clear();
        
        File dossier=new File(nomDossier);
        if (!dossier.isDirectory()) // si le dossier n'en est pas un, on ne fait rien
        {
            System.err.println(dossier.getAbsolutePath()+" n'est pas un dossier");
            return;
        }
        
        File[] liste=dossier.listFiles(); // liste de tous les fichiers du dossier
        
        for (File f:liste) // on parcourt un à un les fichiers
        {
            if (f.isFile() && f.canRead() && bonneExtension(f,extensions))
            {
                if (recherche(f,inf)) // si le fichier satisfait à la recherche, on l'ajoute
                    add(f);
            }
        }        
    }
    
    /**
     * Supprime tous les fichiers préalablement analysés comme satisfaisant à la recherche
     * Attention : les fichiers ne sont pas envoyés à la corbeille, mais directement effacés
     */
    public void supprimerTout()
    {
        for (File f: this)
        {
            if (!f.delete())
                System.err.println(f.getAbsolutePath()+" n'a pas pu être supprimé");
        }
    }
}

// Main.java

import java.io.File;
import java.util.Scanner;

/**
 * Classe principale
 * @author KX
 */
public class Main 
{
    /**
     * 1) Demande un nom de dossier à l'utilisateur
     * 2) Analyse le dossier
     * 3) Affiche les résultats de l'analyse et demande confirmation
     * 4) Supprime si l'utilisateur a confirmé
     */
    public static void main(String args[])
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("Chemin d'accès au dossier : ");
        String s=sc.nextLine();
        
        Informations inf=new Informations("Pass=","Age=","Code=","Id=");
        Analyse a = new Analyse(s, inf, "ini");
        
        System.out.println(a.size()+" fichiers prêts à être supprimés : ");
        for (File f: a)
        {
            System.out.println(f.getAbsolutePath()); // on affiche les fichiers prêts à être supprimés
        }
        
        System.out.println("Confirmer la suppression ? (O/n)");
        if (sc.nextLine().charAt(0)=='O')
            a.supprimerTout();
    }
}

La confiance n'exclut pas le contrôle
2
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 19:06
J'ai rajouté des commentaires au code pour pouvoir comprendre ce que je fais et modifier le programme selon tes propres besoins.
0
salexandre Messages postés 2 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 18 décembre 2010 1
18 déc. 2010 à 17:29
regarde par ici :

comment extraire des informations depuis un fichier .ini

https://franckh.developpez.com/articles/c-ansi/parsing/?page=IV
1
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
18 déc. 2010 à 17:42
Wouah vraiment sympa d'avoir passé de ton temps a réalisé un code pour autrui.

"Chaque classe Java doit être enregistrée dans un fichier portant le nom de la classe dans un même dossier. Il faudra ensuite les compiler !"

Bien donc je dois créer si je comptes bien, 4 fichiers ( 4 classes) puis les compiler ( je sais pas trop comment faire mais je vais me renseigner, sans te faire perdre du temps la dessus). Le titre du fichier sera celui de la classe.

Mais le programme qui exécutera l'ensemble ça sera l'un d'eux?

Désolé si j'insulte les connaisseurs par mon ignorance, mais à l'origine je cherche pas a faire du codage, sinon je lirais des tuto... je dois juste trier des ini et en supprimer et manuellement c'est très long.

merci.
1
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
Modifié par KX le 18/12/2010 à 18:32
La classe principale est la classe Main (wahou !!!) dont la méthode main (rewahou !!!) effectue les opérations en appelant les autres classes...
Pour compiler tu peux utiliser Eclipse, tu lui diras de créer un nouveau projet, avec des classes déjà existantes (les miennes), et il devrait tout compiler et exécuter....
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 15:49
Avec quel langage de programmation ?
Si ce n'est pas important, je pense que cela se ferait facilement en Java, car il y a pas mal de classes sur la manipulation de fichiers, dossiers...
0

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

Posez votre question
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
Modifié par nikossss le 18/12/2010 à 15:56
peu importe du moment que ça fonctionne car je n'ai pas envi de le faire manuellement, soit ouvrir + de 1000 fichiers , regarder si le code est = 1 et l'id < 6 alors je delete ce fichier. Matière programmation je ne mis connait pas vraiment mais une base à modifier m'aiderais, pour un pro je pense c 'est rapide et pas difficile à faire.
0
comment est ce que les fichiers sont nommé ? y a-t-il une suite logique ? par exemple 1.ini 2.ini ... ?
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 16:04
Peu importe, en Java, on peut récupérer la liste des fichiers contenus dans le dossier, il suffit juste de filtrer ceux qui ont l'extension .ini
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
Modifié par nikossss le 18/12/2010 à 16:06
le titre pas vraiment, enfin on peu l'organiser de façon alphabétique en tris.
De toute manière il n'y a que du .ini
0
salexandre Messages postés 2 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 18 décembre 2010 1
18 déc. 2010 à 16:41
juste un instant, je vais voir ce que je peux faire pour toi
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
18 déc. 2010 à 18:30
ok je vois ça même si l'installation d'éclipse semble compliqué^^. Je te tiens au courant, j'espère avant le diner
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 18:32
L'installation d'Eclipse n'a rien de compliquer, tu télécharges, tu dézippes, et c'est tout !
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
Modifié par nikossss le 18/12/2010 à 20:18
J'avais enfaite un problème de java virtual machine. Mais s'est résolu.

Donc j'ai ouvert un projet "test" j'ai mis dedans les 4 classes, le titre a le même nom que la classe.

https://www.casimages.com/i/101218075711458920.jpg.html

Voici un screen, pour le compiler je pense que c'est run, j'ai tester sur test, j'ai eu une demande de debloquage du par-feu, mais rien ne s'est passé je pense. Déjà vérifier si je suis dans la bonne voix. Une fois compilé ça sera comme un programme exécutable ou de cmd ms dos?


Edit: j'ai testé, en mettant le lien dans la console du dossier voulu et ça fonctionne!!


Je vais testé tranquillement ça après mangé en faisant des modifs et je pense j'aurai une ou 2 questions. Mais je voudrais remercier KX pour sa très grande aide. Merci beaucoup.
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 20:19
En fait si, il s'est passé quelquechose...
En bas de ton image, dans l'onglet Console, s'est affiché Chemin d'accès au dossier :
Eclipse attend que tu lui donnes le nom du dossier où sont les fichiers.
Dans un premier temps, je te conseille au préalable de copier ton dossier pour tester que ça fais bien ce que tu veux avant de tout supprimer !
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 20:24
Pour exécuter le programme, tu peux donc faire run sur Eclipse, ou alors tu peux créer un fichier .cmd avec le contenu java Main, ce fichier .cmd devra se trouver avec les fichier .class (qui sont générés par Eclipse dans le dossier test/bin)
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
Modifié par nikossss le 18/12/2010 à 21:45
ok merci, je pense ma dernière question, le "Chemin d'accès au dossier : " c'est seulement pour l'interne? Si mes .ini se trouvent dans un serveur externe, j'y ai accès via ftp ou panel internet, je peux indiqué le répertoire du ftp par exemple?
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 22:09
Bonne question, mais j'en sais rien...

Moi j'ai utilisé File(String pathname). Apparemment il existe un File(URI uri).
Cela nous amenerait à manipuler des URI (Uniform Resource Identifier), que je ne connais pas, et que je ne pourrais de toute façon pas tester, mais ça semble être faisable.

Intuitivement, je dirais qu'il faut construire un URI pour représenter le dossier distant (une simple chaîne de caractères ne suffisant plus), mais une fois le File bien construit, le reste du code devrait rester identique...
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
18 déc. 2010 à 22:17
Je testerai pour voir vite fait, je dirai comment ça s'est passé. sinon je vais pas me prendre la tète ( ou celles des autres) , je DL sur mon pc et je le fais en local puis je le renvois sur le serveur extérieur. Même si je pouvais exécuter directement le programme sur le serveur externe, il est sur linux donc ça change.
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
18 déc. 2010 à 22:25
Normalement, Windows ou Linux, ça ne change rien, Java est multiplate-forme.

Dans Analyse.java, le constructeur Analyse a une ligne au début :
File dossier=new File(nomDossier);
remplace là par File Dossier=new File(new URI(...));

La question est de savoir quoi mettre à la place des ...
Une adresse IP entre guillemet pourrait suffire avec un peu de chance : URI(String str)

C'est à tester...
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
19 déc. 2010 à 16:40
Pour le ftp j'ai pas vraiment de répertoire, d'adresse précise...donc je vais laisser tomber de ce coté, tout mettre sur mon pc et traiter dessus.

J'aimerai savoir ou se trouve, après recherche je n'ai pas trouvé, le log consultable de la console, afin de vérifier plus tard ce qui a été supprimé.

Et aussi un autre petit soucis c'est le fait de transférer de linux à windows ( avec les cases sensitives) car sur linux j'ai un fichier Test.ini et test.ini au moment de télécharger sur mon pc donc windows on me dit que le fichier existe déjà, donc un sera supprimé. Il faudrait supprimé au pire le plus léger, même si je dis ( via filezila) en fonction de la taille, il va garder le plus lourd, qui est toujours celui avec les majuscules, mais 1 fois sur 2, il prend soit en majuscule ou en minuscule le titre du fichier, un peu embêtant.
Par contre si je compresse ( .rar) les fichiers lors du téléchargement, sur mon PC tant que je ne décompresse pas le fichier test Test est correctement gardé.
Je pensais donc à lancer java dans le winrar , ça m'indique que ce n'est pas un dossier, le script est modifiable, mais je voulais savoir si c'etait possible sur un "dossier" compressé.
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 566
19 déc. 2010 à 16:45
Salut,

Juste un truc... les fichiers à supprimer sont sur quel système ? Windows ou Linux ?
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
19 déc. 2010 à 16:47
J'ai fait ça rapidement donc il n'y a pas de log, mais le programme affiche les fichiers à supprimer avant la confirmation.
Concernant ton problème de casse, manipuler des zip est faisable en java, mais je ne sais pas faire, pourquoi ne pas copier tes fichiers directement sous Linux ? Le programme Java marchera pareil !
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
19 déc. 2010 à 16:55
Pour les logs ok il faut le scripter, oui la console indique mais elle à une limite, car hier jai testé sur 22000 fichiers, donc plus de 10000 de supprimés et il n'y avait pas toute la liste, enfin pas très grave ça.
Ensuite quand tu parles de "pourquoi ne pas copier tes fichiers directement sous Linux" tu parles de quels fichiers?
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
Modifié par KX le 19/12/2010 à 16:58
plutôt que de copier tes fichiers sous Windows, copie les sous un OS Linux (éventuellement émulé), pour faire le traitement directement sur un ordinateur Linux avant de rebasculer sur le serveur
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
Modifié par nikossss le 19/12/2010 à 17:05
ah ok pas bête, faut je me renseigne la dessus car mes compétences sont limitées, un ordi avec linux je connais personne qui en a un. pour un émulé je vais voir ça sur le net trouvé un petit programme qui permettrait de créer sur wins une partie Linux.
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
19 déc. 2010 à 16:48
Windows sur mon pc, car sur linux ( serveur externe et accès que via ftp, avec accès limité) je ne peux exécuter le programme java fait pas KX dessus.
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 566
19 déc. 2010 à 16:50
Ok. Donc les fichiers à supprimer sont sur Linux ?
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
19 déc. 2010 à 16:54
Si j'ai bien compris, ses fichiers sont sur un serveur Linux, mais le programme que j'ai fait ne permet de faire de la manipulation que sur un ordinateur (peu importe l'OS) car la manipulation à distance du serveur, ça je ne sais pas faire.
nikossss proposait donc de copier tous ses fichiers sur son ordinateur (Windows), utiliser mon programme, et recoller les fichiers restants sur le serveur.
Le problème est qu'il a sur son serveur Linux des fichiers qui ont des noms identiques à la casse près, que Windows considère comme des doublons...
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 566
Modifié par zipe31 le 19/12/2010 à 17:22
Petit exemple sous Linux :

$ ls -1 # Liste des fichiers
fich1.ini
fich2.ini
fich3.ini
fich4.ini
fich5.ini
fich6.ini

$ cat fich* # Contenu des fichiers
Fich1
Pass=AAA
Age=
Code=1
Id=2

Fich2
Pass=BBB
Age=
Code=2
Id=3

Fich3
Pass=CCC
Age=
Code=1
Id=7

Fich4
Pass=DDD
Age=
Code=1
Id=5

Fich5
Pass=EEE
Age=
Code=32
Id=3

Fich6
Pass=FFF
Age=
Code=1
Id=18

# Seuls les fichiers 1 et 4 doivent être supprimés

Ci-dessous la commande qui va chercher tous les fichiers *.ini contenant l'expression "Code=1" et Id=[0-5], pour les passer à la commande "rm"


$ find . -name "*" -exec grep -l 'Code=1$' {} \; | xargs egrep -l 'Id=(1|2|3|4|5)$' | xargs rm -f

$ ls -1 # Liste des fichiers restants
fich2.ini
fich3.ini
fich5.ini
fich6.ini

$
;-))


Édit :

Je rajoute juste de quoi récupérer la liste des fichiers effacés :

 find . -name "*" -exec grep -l 'Code=1$' {} \; | xargs egrep -l 'Id=(1|2|3|4|5)$' | xargs  -t rm -f 2>log.tmp
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
19 déc. 2010 à 17:15
merci c'est sympa. KX disait que ce soit linux ou wins le code était compatible. Qu'apporte ton code de plus?
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 566
19 déc. 2010 à 17:19
Il apporte déjà qu'il est exécutable et compatible 100% Linux.
Il ne tient que sur une seule ligne ;-)

Sinon, pour installer un environnement Linux sur ton PC équipé de Windows, il y a Cygwin
Tu peux aussi installer cette compilation d'utilitaires portables sous Windows : GNU utilities for Win32.

As-tu un accès "ssh" sur ton serveur ?
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 566
20 déc. 2010 à 13:39
Tiens, un exemple de ce qu'il est possible de faire sous un environnement GNU/Linux, avec 3 commandes :

Le listing sur le serveur FTP avant

Le contenu des fichiers est le même que dans mon précédent post.

Je pars d'un répertoire vide sur mon PC en local.

# La commande de récupération du répertoire "Dossier"
$ lftp login:mot_de_passe@blabla.free.fr -e "mirror -v /;quit"
Création du répertoire « Dossier »
Transfert du fichier « Dossier/fich1.ini »
Transfert du fichier « Dossier/fich2.ini »
Transfert du fichier « Dossier/fich3.ini »
Transfert du fichier « Dossier/fich4.ini »
Transfert du fichier « Dossier/fich5.ini »
Transfert du fichier « Dossier/fich6.ini »
Total : 2 répertoires, 6 fichiers, 0 liens symboliques
Nouveau : 6 fichiers, 0 liens symboliques
200 octets transférés en 4 secondes (48o/s)

$ ls     # Listing de mon répertoire local
Dossier/

$ ls Dossier/     # Listing du contenu du répertoire local
fich1.ini  fich2.ini  fich3.ini  fich4.ini  fich5.ini  fich6.ini

# On lance la commande de suppression des fichiers correspondants aux critères. On logue les actions effectuées dans un fichier nommé "log.tmp"
$ find . -name "*" -exec grep -l 'Code=1$' {} \; | xargs egrep -l 'Id=(1|2|3|4|5)$' | xargs  -t rm -f 2>log.tmp

$ ls     # Listing de mon répertoire local
Dossier/  log.tmp

# Contenu du fichier de log
$ cat log.tmp
rm -f ./Dossier/fich4.ini ./Dossier/fich1.ini

# Nouveau listing du contenu du répertoire local. Les fichiers adéquats ont été supprimés (le 1 et le 4)
$ ls Dossier/     
fich2.ini  fich3.ini  fich5.ini  fich6.ini

# On re-balance le tout sur le site en prenant soin d'effacer les fichiers non présents en local (option "-e"). En fait l'action de mirroring ne fait que ça, effacer les fichiers...
$ lftp login:mot_de_passe@blabla.free.fr -e "mirror -v -e -R Dossier ;quit"
Suppression de l'ancien fichier « fich1.ini »
Suppression de l'ancien fichier « fich4.ini »
Total : 1 répertoire, 4 fichiers, 0 liens symboliques
Supprimé : 0 répertoires, 2 fichiers, 0 liens symboliques

$


Le listing sur le serveur FTP après

Voilà, reste plus qu'à mettre ces 3 commandes dans un ordonnanceur de tâches (crontab) et la makina s'occupe de tout :-))
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 129
Modifié par heyquem le 20/12/2010 à 14:00
Salut,



Je n'avais pas encore réalisé que les noms de fichiers en Windows ne tiennent pas compte de la casse et que cela interdit que les deux noms de deux fichiers ne diffèrent que par la casse de certaines lettres. Honte.



Ayant pigé le problème, je vois trois possibilités.



!) Je me suis dit que le mieux pour traiter le problème en continuant avec Python (vu que je ne connais bien que lui) était que j'étudie le module FTP de Python.

Donc voilà:
https://docs.python.org/3/library/ftplib.html#index-351
Ça ne me paraît pas compliqué.
J'ai donc ouvert un compte FTP sur diino.com pour faire les tests en vrai.

Mais il y a un hic. Je n'arrive pas à savoir quelle adresse faut il mettre dans l'instruction
connexion_ftp = FTP([host[, user[, passwd[, acct[, timeout]]]]])
à la place de host.
J'ai essayé des tas d'adresses pompées dans la barre d'adresse en étant sur différentes pages du site, mais aucune ne convient.

J'ai donc écrit au support de dinoo.com, en leur demandant quelle est l'adresse que je dois indiquer pour faire une communication automatisée à partir d'un programme. Réponse sèche:
« Hi,
sorry but it's not possible.
Regards /Tomas »
Zut !

Cette réponse ne me convainc pourtant pas. Pour autant que je comprenne les choses, une connexion FTP étant basée sur le modèle client-serveur, il me semble que du moment qu'un site serveur reçoit une requête correctement formatée, il devrait renvoyer une réponse, car je ne vois pas comment un site peut détecter si une requête a été construite par un programme où si elle résulte du remplissage à la main d'un formulaire par un humain.

Mais pour le moment je suis bloqué. Explanations needed.

Et comme je suppose que ça ne t'intéresse pas d'attendre que soit résolu ce point dans un langage que tu ne connais pas, j'ai cherché d'autres solutions.



Une précision: avec Python, on peut parfaitement créer des exécutables qui pourront tourner sans que l'ordinateur sur lequel ils tournent ait eu à installer l'environnement Python.
Mais pour manipuler des fichiers FTP avec Python, le procédé n'est pas d'installer sur le site FTP un exécutable qui traiterait les fichiers sur le site comme une souris installée dans un gruyère. D'après ce que j'ai vu dans le module FTP de Python, on envoie des ordres au site au moyen d'instructions du programme qui tourne sur l'ordinateur client qui interroge le site distant, ces instructions doivent respecter un format de données pour que les ordres soient acceptés par le site FTP, mais c'est ensuite le programme assurant la gestion du site FTP qui effectue lui-même les opérations demandées.






2) Il doit y avoir une indication du nombre de fichiers dans chaque dossier, sur le site FTP que tu utilises nokissss. Tu pourrais donc faire ceci:

- tu notes le nombre de fichiers dans le dossier FTP qui t'intéresse

- tu télécharges les fichiers de ce dossier sur ton ordinateur, dans un dossier préalablement vide

- pour chaque paire de doublons, un des deux fichiers aura disparu à l'arrivée. Le nombre de fichiers après téléchargement sera donc inférieur

- tu déterminesce nombre de fichiers après téléchargement sur ton oridnateur

- par différence avec le nombre sur le site FTP, tu peux déduire le nombre de fichiers à noms identiques-sans-casse dans le dossier sur le site FTP



Si le nombre de doublons n'est pas trop important , par exemple inférieur à 5 ou 10 on va dire ( c'est à toi de voir ce que tu considères limité comme nombre) eh bien tu peux envisager faire à la main la procédure suivante:

- chercher quels sont les fichiers en doublons

- pour chaque doublon, renommer l'un des deux fichiers, en alongeant le nom avec une chaîne suffisamment compliquée pour ne pas créer un autre doublon avec un autre fichier qui n'en avait pas

- après avoir fait disparaître tous les doublons, tu retélécharges, tu vérifies que le nombre de fichiers obtenus est bien le même que celui existant sur le site fTP

- et tu lances un programme sur les fichiers

- après traitement, tu réenvoie sur le site FTP les fichiers qui restent après ce filtrage, et tu renommes en sens inverse les fichiers qui avaient eu leur nom maquillé





3) Si le nombre de doublons est trop important (genre au delà de 50) , je pense que ce qui serait problématique, ce serait de chercher les fichiers concernés dans le fouillis de tes 1000 fichiers. Trop fastidieux.

Mais comme il n'y aurait pas d'autre solution que de traiter à la main, je pense à cette possibilité pour facilter cette recherche:

- tu crées un sous dossier dans le dossier sur le site FTP contenant les fichiers à traiter

- tu déplaces successivement des sous-ensembles, de par exemple 70 fichiers, pris parmi les 1000 fichiers à traiter, vers ce sous-dossier

- après chaque déplacement dans le site FTP, 70 fichiers d'un coup donc, tu les télécharges sur ton ordinateur

- en comparant les nombres de fichiers, d'une part dans le sous-dossier sur le site FTP, d'autre part dans ton dossier de réception du téléchargement, tu vérifies comme précédemment s'il y a des doublons ou non

- si un lot de 70 fichiers ne contient pas de doublons , tu peux lancer un programme de traitement dessus



Évidemment ça risque d'être un peu fastidieux quand même, mais je ne vois pas ce qui peut être fait d'autre.



PS:

Je suis parfaitement d'accord avec KX dans ce qui suit:

On peut polémiquer pendant des heures mais tu as 3 codes qui te ferons la même chose tels qu'ils sont actuellement, et avec les même propriétés

Une fois que tu as un programme, s'il fait ce que tu veux, peu importe pour toi. En critiquant l'usage de Java, je pensais par contre à celui qui rédige le code en Java. C'est beaucoup plus pénible avec Java qu'avec Python.

Mais pour le moment, que ce soit Java ou Python, le problème n'est pas résolu, le fait est là.

Je me demande simplement si c'est dû à mon ignorance du module FTP de Python, à l'insuffisance de Python, ou à une limitation d'accés posée par le site dinoo que j'ai testé.



Quelqu'un connaïtrait il un serveur FTP gratuit qui permette des interrogations automatisée par un programme-robot ?
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 129
20 déc. 2010 à 21:00
Ça y est, j'ai réussi à obtenir une connexion à un serveur FTP via un programme Python, en ouvrant un compte FTP chez embreon.com

J'ai un code de 18 lignes qui arrive presque au bout de faire tout ce qui lui est demandé. Il reste un petit bug que je ne comprends pas. Je me réoccupe de ça en fin de soirée pour le corriger, et je posterai le code dans la foulée.

Nikossss, il faudrait que tu m'écrives à heyquem@gmail.com pour que je puisse t'envoyer les codes d'accès au compte FTP par MP.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 129
21 déc. 2010 à 10:21
1)

* télécharger l'installateur de Python 2.7.1 correspondant à ta plateforme
https://www.python.org/downloads/release/python-271/
[ 1mn45" pour moi pour télécharger Windows x86 MSI Installer (2.7.1) ]
Parce que j'ai écrit le code en Python 2.7


* lancer l'installation de l'environnement Python
[ 1mn 20 " pour moi ]
Les features installées sont la principale, Python ( 22 MB) , et les secondaires (29 MB) ( Register Extension, Tcl/Tk, Documentation, Utility Scripts, Test suite).
La Documentation peut être décochée pour l'enlever de l'installation car elle est disponible en ligne et prend environ 6 MB)



2)

* Démarrer / Programmes / Python 2.7 / IDLE (Python GUI)

IDLE est l'EDI inclus dans la distribution, qui fonctionne avec Tkinter basé sur Tcl/Tk.

Deux fenêtres s'ouvrent:

- une fenêtre dessous: c'est IDLE en mode Shell, avec un en-tête, pour une utilisation de l'interpréteur en ligne de commandes. Les résultats d'une exécution s'afficheront aussi dans cette fenêtre.
La différence avec l'ouverture de
Démarrer / Programmes / Python 2.7 / Python (command line) ,
c'est que
le Shell IDLE est sur fond blanc au lieu de Python (command line) sur fond noir
et que ce dernier n'utilise pas Tkinter ce qui assure une plus grande rapidité et moins de bugs de GUI

- une fenêtre dessus la précédente: c'est IDLE en mode Edit, destinée à l'écriture ou la copie d'un code.
L'ouverture de la fenêtre IDLE en mode Edit peut être désactivée en cochant Open Shell Window dans Options / Configure IDLE... , onglet General.

* Copier dans la fenêtre IDLE en mode Edit le code suivant

import urllib,mmap
from ftplib import *

import re 
pat = re.compile('Pass=.+\nAge=.+\nCode=\s*1\s*\nId=\s*[012345]\s*(?:\n|\Z)')

ftp_dt = FTP()
ftp_pi = FTP()
print '\n- Ouverture de connection et logging : OK'

def examiner(contenu, bla = " Code=1 et Id<6 ==> DELETION DE CE FICHIER sur le serveur FTP"):
    if pat.search(contenu):
        print '----- '+ name +' ' + 14*'----' + '\n' + contenu + bla
        ftp_pi.delete(name)
    else:
        print '----- '+ name +' ' + 14*'----' + '\n' + contenu

ftp_dt.cwd('public_html/eftepe')
ftp_pi.cwd('public_html/eftepe')

for name in ftp_dt.nlst():
    if name not in ('.','..') and ftp_dt.size(name) and name[-4:]=='.ini':
        ftp_dt.retrbinary('RETR '+name, examiner)

ftp_dt.quit()
ftp_pi.quit()



* Remplacer les deux lignes

ftp_dt = FTP()
ftp_pi = FTP()

par les deux lignes que je fournirai par MP


* Faire File / Save As... ( ou Ctrl+Shift+S ) pour enregistrer le script, dans n'importe quel fichier.



3)

Exécuter en faisant Run ( ou F5 )

Quand on fait ultérieurement des modifications d'un code et qu'on relance une exécution, il y a un prompt qui apparaît pour demander si les modifications doivent être enregistrées: "Source Must Be Saved. OK to save ?"
Pour empêcher l'apparition de ce prompt à chaque fois qu'on fait Run, cocher "No Prompt" dans Options / Configure IDLE... , onglet General.

Il y a actuellement 7 fichiers dans le dossier public_html/eftepe du compte FTP en question:
FAFA.ini , faFA.ini , fafa.ini , fefe.ini , fufu.ini , gege.txt , toto.txt

Le fichier faFA.ini contient Code=1 et Id=3 et est détruit à distance dans le dossier FTP par le site FTP quand il reçoit l'ordre envoyé par l'instruction
ftp_pi.delete(name)
quand name vaut 'faFA.ini'
Comme il s'agit de l'exécution d'une commande pour envoyer un ordre, ça doit utiliser un autre canal que celui qui a été précédemment utilisé pour télécharger les données avec retrbinary(), donc ftp_pi au lieu de ftp_dt


L'exécution du code affiche:

>>>
- Ouverture de connection et logging : OK
----- fufu.ini --------------------------------------------------------
Pass= afg
Age= 12
Code=9
Id= 2
----- fefe.ini --------------------------------------------------------
Pass= radamo
Age= 34
Code= 1
Id= 23
----- fafa.ini --------------------------------------------------------
Pass= radamo
Age= 34
Code= 1
Id= 23
----- faFA.ini --------------------------------------------------------
Pass= radamo
Age= 34
Code= 1
Id= 3
Code=1 et Id<6 ==> DELETION DE CE FICHIER sur le serveur FTP
----- FAFA.ini --------------------------------------------------------
Pass= radamo
Age= 34
Code= 1
Id= 44
>>>



4)

Tu as intérêt à tester en empêchant la délétion,
pour voir ce qui se passe et si ça correspond à ce que tu attends.

Pour empêcher la délétion de se faire, il faut transformer la commande delete en commentaire:
# ftp_pi.delete(name)
au lieu de
ftp_pi.delete(name)



5)

Quelques indications sur le code:


* ftp_dt et ftp_pi sont deux connexions qui sont crées avec le serveur FTP
Il en faut deux, car en FTP les transferts de données se font sur un canal, tandis que les transferts relatifs aux ordres envoyés au serveur FTP doivent se faire sur un autre canal.
Je n'avais écrit qu'une création de connexion au début, c'est ce qui créait un bug: la connexion ftp utilisée d'abord pour transiter les données était brusquement fermée dès que la commande delete était exécutée.

ftp_dt c'est pour "data transfer" et ftp_pi c'est pour "protocol interpretation".
Voir:
https://www.commentcamarche.net/contents/519-le-protocole-ftp-file-transfer-protocol


* ftp_dt.cwd() et ftp_pi.cwd() changent le répertoire courant dans le compte FTP vers lequel sont ouverts les canaux ftp_dt et ftp_pi


* ftp_dt.nlst() renvoie une liste des noms de dossiers et fichiers se trouvant dans le répertoire courant.


* J'ai mis name not in ('.','..') parce qu'il y a des fichiers cachés nommés '.' et '..' dans les répertoires du compte FTP.
Au début je les voyais en allant dans le compte, maintenant je ne les vois plus, je ne sais pas pourquoi.
Il perturbent les choses: la commande retrbinary() foire sur ces fichiers
Le test ftp_dt.size(name) est pour s'assurer qu'il s'agit d'un fichier et non pas d'un dossier, car un fichier a une taille tandis qu'un dossier renvoie None.


* examiner() est une fonction de callback passée comme argument à la fonction retrbinary()
Celle-ci ordonne l'envoi en binaire du fichier concerné du site FTP vers le client FTP. La fonction de callback analyse chaque flux qui arrive.


* J'ai amélioré la RE:
'Pass=.+\nAge=.+\nCode=\s*1\s*\nId=\s*[012345]\s*(?:\n|\Z)'
pour tenir compte de la possibilité de blancs dans les lignes Code= 2 et Id= 24 , et du fait que la ligne Id peut se terminer par une fin de ligne '\n' ou par la fin du fichier.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 129
Modifié par heyquem le 19/12/2010 à 19:56
Y a personne qui s'étrangle en voyant un code pareil en Java pour faire un aussi petit machin que le demande nikosss ???

Même si on met de coté les lignes de commentaires, on y voit bien que Java oblige à enguirlander l'objectif principal de tout un tas de cérémonies autour, qui encombrent l'esprit, la rédaction et le code. Un vrai arbre de Noël.



Installer Python prend 5 minutes.
Créer le script à partir d'un copier-coller, 1 minute.
Moi j'ai mis 10 minutes à l'écrire:

from os import listdir,remove  
from os.path import isfile  

import re  
pat = re.compile('Pass=.+\nAge=.+\nCode=1\nId=[012345]')  

dirname = raw_input('Entrer le nom du dossier : ')  
if dirname[-1]!='\\':  
    dirname += '\\'  

gen_files = ( f for f in listdir(dirname) if isfile(dirname+f) and f[-4:]=='.ini' )  

for fich in gen_files:  
    if pat.search(open(dirname+fich,'r').read()):  
        remove(dirname+fich)
-2
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
Modifié par nikossss le 19/12/2010 à 19:55
"pfffff.........."

Pas besoin d'être désagréable. Des personnes aident et ne demandent rien en retour, de plus son script marche très bien. Si tu veux faire avancer la chose, niveau script c'est bon, ( sauf si ton programme est exécutable, sous forme de fichier de commande MS-DOS. exe ...que je puisse mettre directement dans mon ftp pour l'exécuter labas. sinon le souci ce pose plus niveau case sensitive ( suppression des fichiers doublons sur wins)
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 129
19 déc. 2010 à 20:28
« Pas besoin d'être désagréable. »
OK avec toi. J'ai donc enlevé mon « pfff.... » dans mon message si c'est ressenti comme désagréable.




Mais ce n'était pas pour être désagréable. De temps à autre, y a la vapeur qui sort un peu après accumulation. C'était pour exprimer le mélange d'ahurissement et d'énervement que je ressens quand je vois certains cas. Ahurissement de voir l'obésité de Java, la complexité de C++, l'embrouillamini des PHP, l'ésotérisme de Perl. C'est surtout ces langages majoritairement utilisés qui me mettent en rogne, parce que qu'ils sont encore trop estimés par rapport à ce qu'ils valent vraiment et que j'ai l'impression que le discours général sur ces langages, selon lequel c'est encore les mieux auxquels s'adresser quand on veut faire de la programmation, oriente encore pour le moment trop de personnes vers leur apprentissage et les détourne ainsi d'autres langages qui les feraient beaucoup moins suer.

C'est sûr que c'est gentil d'aider les autres. Mais ça ne doit pas être un bouclier qui préserve de toute critique.

De même si son script marche très bien, encore heureux. On doit pouvoir faire ça dans n'importe quel langage, pas simplement en Java et en Python.
D'ailleurs soit dit en passant, je ne sais pas si on peut appeler son code un script, car Java est un langage compilable, alors que les scripts sont les codes des langages interprétables, d'après ce que j'ai compris. Mais la terminologie sur ce point me semble un peu flou, et je ne suis sûr de rien.



Je n'ai pas bien compris la fin de ton message, nikossss.
Tu voudrais un exécutable ? ou non..?
Commandes MS-DOS ? pas en Python alors ?

« là-bas », c'est quoi ?. J'ai lu tous les posts mais je n'ai pas bien compris. Je ne suis pas très au courant des communications FTP. Mais Python pouvant tout faire, il suffirait de quelqu'un de plus compétent que moi sur un forum pour te faire ce qu'il te faut en un rien de temps.
Je vais essayer de regarder un peu plus
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 129
19 déc. 2010 à 20:39
Je n'ai jamais utilisé le module du protocole FTP en Python, mais ça n'a pas l'air bien compliqué.

https://docs.python.org/3/library/ftplib.html
0
nikossss Messages postés 19 Date d'inscription samedi 18 décembre 2010 Statut Membre Dernière intervention 19 décembre 2010 1
19 déc. 2010 à 21:32
oui ok pas de soucis.

Voila j'ai donc 3 scripts gentiment fait.

- Une commande que pour Linux mais je n'ai pas accès pour l'exécuter. ( accès limité sur le serveur Linux où sont mes fichiers)
- Un script java que je peux utiliser que sur wins
- Ton script mais je connais pas son exécution.

Le top c'est d'avoir un petit exécutable que j'envoie sur le serveur Linux ou se trouve tout les fichiers .ini et il fait son travail.
Ou bien je transfert les fichiers de Linux à Windows donc je peux facilement utiliser le script java mais il se pose un problème pour les fichiers doublons, qui sont sur Linux test.in Test.ini mais une fois sur wins il en supprime un.

J'espère être clair.
0
KX Messages postés 16597 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 septembre 2022 2 975
19 déc. 2010 à 21:40
La commande Linux de zipe31 peut-être exécuté en local (copier tes fichiers faire la manip et renvoyer) mais sous Linux, sous Windows il faut essayer Cygwin ou autre
Le programme Java peut-être utilisé sous Windows ou Linux ou autre du moment que la JVM est installée.
Le script Python je ne sais pas trop mais je dirais comme Java : Windows ou Linux du moment que c'est installé.

Dans tous les cas tu peux le faire en local mais pas sur le serveur (accès FTP, protection côté serveur...) et dans tous les cas ça marchera sous Linux, mais sous Windows tu auras un problème de casse.

On peut polémiquer pendant des heures mais tu as 3 codes qui te ferons la même chose tels qu'ils sont actuellement, et avec les même propriétés
0