IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Boucle sur répertoire ftp


Sujet :

Shell et commandes POSIX

  1. #1
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut Boucle sur répertoire ftp
    Bonjour,

    Voilà mon problème : j'ai des fichiers dans un serveur distant que je veux accéder par ftp sur lesquels je veux lancer un script perl à partir de mon serveur local.

    Je ne connais pas le nombre de fichier à traiter.
    Je ne connais pas les noms des fichiers.
    Je n'ai pas assez de place en local pour rapatrier tous les fichiers.

    Les solutions explorées étaient :
    - de récupérer les fichiers un à un, de lancer le perl et de le supprimer
    --> je n'ai jamais réussi à faire une boucle qui fonctionne, voici ma base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ftp -i -n -v << =END=
    open $hostname
    user $username $password
    cd $repertoire
    get $filename
    quit
    =END=
     
    perl monfichier.pl $filename
    A chaque fois que j'essaye de placer le for ça ne va pas...

    - de lancer le script perl directement sur le dossier distant et d'écrire le résultat en local
    --> Voilà ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ftp -i -n -v << =END=
    open $hostname
    user $username $password
    cd $repertoire
    !perl monfichier.pl $repertoire/*
    quit
    =END=
    Sans ! l'instruction perl n'est pas reconnue et avec c'est le répertoire qui n'existe plus (car il cherche en local)


    Est-ce que vous avez des solutions à me proposer ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Bonjour,

    Peux-tu nous montrer ton code avec la boucle for ?

    Sinon, en imbriquant le perl dans la partie ftp, tu es obligé de faire un get avant, car comme tu l'as compris, le perl est local.

  3. #3
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Pour la boucle for j'avais pensé à faire qqchose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ftp -i -n -v << =END=
    open $hostname
    user $username $password
    cd $repertoire
    for filename in $repertoire/*
    do
    get $filename
    perl monfichier.pl $filename
    !rm $filename
    done
    quit
    =END=
    Et j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    usage: for [ non-print | telnet | carriage-control ]
    ?Invalid command
    J'ai essayé avec ou sans !, mais n'ai pas trouvé le truc qui marche.
    Je pense que c'est sous mes yeux mais j'arrive plus à y voir clair.

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    C'est un peu plus compliqué que ça, la procédure serait plutot celle-ci:

    On garde ta partie unitaire qui à priori fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ftp -i -n -v << =END=
    open $hostname
    user $username $password
    cd $repertoire
    get $filename
    quit
    =END=
     
    perl monfichier.pl $filename
    Maintenant, le but est de rajouter la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for filename in $(<liste_de_fichiers.txt)
    do
    ftp -i -n -v << =END=
    open $hostname
    user $username $password
    cd $repertoire
    get $filename
    quit
    =END=
     
    perl monfichier.pl $filename
    #potentiel rm du fichier ou d'autres instruction lié au fichier
    done
    Et là, comme on peut le voir, il faut définir la liste_de_fichiers, pas le choix, il faut donc que tu fasses une première connection ftp pour récupérer cette liste.
    Donc un bout de code qui ressemblerait à peu près au bout de code que l'on a mis dans la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ftp -i -n -v << =END=
    open $hostname
    user $username $password
    cd $repertoire
    ls . liste_de_fichier.txt
    quit
    =END=
    Remarque1: la ligne du ls pour rediriger le résultat dans un fichier est en principe la syntaxe qui est donné ici (ls . fichier) ne pas oublier le "." .
    Remarque2: Il faudra certainement retraiter un peu le fichier "liste_de_fichier.txt" avant de le fournir à la boucle for.

  5. #5
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Merci beaucoup pour ta réponse.

    J'ai utilisé une boucle while pour lire le fichier et il n'y a pas besoin de le retraiter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    while read filename
    do
     
    ftp -i -n -v << =end=
    open $hostname
    user $username $password
    cd $repertoire
    get $filename
    quit
    =end=
     
    echo "Traitement du fichier $filename" 
    perl monfichier.pl $filename
    rm ../fic/in/$filename
     
    done < ListeFichier.txt

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Tu as bien fait pour la boucle while, car la boucle for n'est pas conseillée dans ce cas là, je suis d'ailleurs surpris que personne ne m'est tapé dessus

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Pas possible d'installer "wget" sur ce serveur ? Ca simplifierait le script ...

  8. #8
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Malheureusement je ne peux pas installer ce que je veux sur le serveur...

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Ou alors, pourquoi ne pas faire le ftp via perl directement ?

  10. #10
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ou alors, pourquoi ne pas faire le ftp via perl directement ?
    Tout simplement que ça a été commencé comme ça et que je continue sur la lancée.

  11. #11
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bon du coup j'ai voulu intégrer ça à mon script perl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # Traitement des fichiers 
    my $ftp = Net::FTP->new($hostname, Debug => 0); $ftp->login($username,$password); 
    $ftp->cwd($repertoire);   
    my $liste_fichier = $ftp->ls(); 
     
    foreach my $nom_fichier (@$liste_fichier) { 
    $ftp->get($nom_fichier);   
    open(FIC, '<', $nom_fichier) or die "Can't open $nom_fichier: $!";       
     
    # Lecture du fichier fourni en paramètre     
    while (<FIC>) {         
        # traitement     
    } 
    close(FIC); 
    unlink $nom_fichier;   
    }
    Et là tout marche bien jusqu'à ce que je traitre un fichier de 1Go20 :
    Quelqu'un aurait une solution pour que ça marche ?

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Ce ne serait pas plutôt la partie traitement qui génère l'erreur car il essaierait de le charger entièrement en mémoire ou du moins un volume très conséquent ?

    Si tu mets le fichier en local et que désactive la partie ftp, est ce que tu n'aurais pas le même problème ?

    Il me semble que tu avais déjà ce problème initialement, avant de vouloir faire tout en perl (enfin si c'est toujours le même projet) ???

  13. #13
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    C'est bien le même projet

    Quand j'exécutais mon perl à partir du shell je n'ai eu aucune erreur du à la taille des fichiers. Mon seul problème était la taille restante sur mon serveur... Sachant qu'il avait déjà pu traiter un ou deux de plus d'1Go.

    Je reteste ça en local et vous dit si ça passe ou pas...

  14. #14
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bon ben j'ai le même problème quand je lance mon script perl sans la partie ftp sur mon fichier de plus de 1Go.

    Y-a-t-il des limites pour les variables perl ?

    [EDIT] : En debuggant les messages suivants apparaissent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Out of memory!
    Memory fault(coredump)
    En cherchant un peu j'ai cru comprendre qu'un fichier core était créé et que c'était lui qui me générait cette erreur et qu'il fallait le supprimer.

    Mais avant ça j'aimerai comprendre à quoi il sert exactement ?
    Et quels seront les conséquences si je le supprime ?

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Ton fichier core est une descente de la mémoire de ton processus au moment du out of memory.
    Il peut servir uniquement pour débugger, tu peux donc l'effacer sans risque.
    Sinon, perl est limiter par ton système (hardware ou software).
    Tu peux faire un ulimit -a pour voir déjà les restrictions système.
    Mais si ton serveur n'a pas la mémoire suffisante, cela ne changera pas grand chose de changer les limites (de plus, seul root pourra le faire).

    Ne pourrais-tu pas fournir aussi le code de la partie traitement et exposer la finalité, histoire de voir si l'approche est bonne ?
    Car j'ai du mal à croire au besoin de devoir charger la totalité du fichier dans une variable.

  16. #16
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ton fichier core est une descente de la mémoire de ton processus au moment du out of memory.
    Il peut servir uniquement pour débugger, tu peux donc l'effacer sans risque.
    Sinon, perl est limiter par ton système (hardware ou software).
    Tu peux faire un ulimit -a pour voir déjà les restrictions système.
    Mais si ton serveur n'a pas la mémoire suffisante, cela ne changera pas grand chose de changer les limites (de plus, seul root pourra le faire).

    Ne pourrais-tu pas fournir aussi le code de la partie traitement et exposer la finalité, histoire de voir si l'approche est bonne ?
    Car j'ai du mal à croire au besoin de devoir charger la totalité du fichier dans une variable.
    Voici ce que me renvoie ulimit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    time(seconds)        unlimited
    file(blocks)         unlimited
    data(kbytes)         1048576
    stack(kbytes)        32768
    memory(kbytes)       32768
    coredump(blocks)     2097151
    nofiles(descriptors) 2000
    threads(per process) unlimited
    processes(per user)  unlimited
    Concernant mon besoin, voici un exemple de fichier :
    01.01.00,'aaa'
    10.01.00,'bbb'
    10.01.02,'ccc'
    20.01.001.01,'ddd'
    20.01.001.02,'eee'
    10.01.00,'fff'
    20.01.001.01,'ddd'
    20.01.001.02,'hhh'
    91.01.00.001,'9'
    Il y a plusieurs "blocs" qui vont d'un enregistrement commençant par 10.01.00 au suivant.
    Je veux récupérer l'ensemble du bloc si la valeur de 20.01.001.01 est égale à 'ddd' et si celle de 20.01.001.02 est égale à 'hhh'.
    Je veux aussi remplacer 'hhh' par 'xxx'.
    Je veux insérer l'entête ainsi que le bloc sélectionné dans un fichier de sortie.
    En fichier de sortie j'aurais donc :
    01.01.00,'aaa'
    10.01.00,'fff'
    20.01.001.01,'ddd'
    20.01.001.02,'xxx'
    91.01.00.001,'5'
    [EDIT]: J'ai mis en pj mon script

  17. #17
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Le problème vient surement de là (1 Go max de données par processus):

Discussions similaires

  1. boucle sur .doc d'un répertoire
    Par rijuju dans le forum VBA Word
    Réponses: 5
    Dernier message: 14/01/2009, 17h58
  2. Lister les fichiers d'un répertoire sur le FTP.
    Par tagada_tagada dans le forum Modules
    Réponses: 1
    Dernier message: 14/01/2009, 11h43
  3. boucle sur des noms de répertoires
    Par machmalabala dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/08/2007, 11h34
  4. boucle sur les répertoires
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 15/06/2007, 01h59
  5. [JSP/WebSphere] Boucle de controle sur un FTP
    Par benben13 dans le forum Websphere
    Réponses: 10
    Dernier message: 30/08/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo