• # Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

    Posté par  . Évalué à 4.

    Quel est le besoin ? Faire cette récupération en une fois ou le faire en automatique ? Ensuite qu'as-tu essayé ?

    Sinon voici une piste.

    S'il sagit d'une action à faire une seule fois, ou en interactif, un outil comme filezilla par exemple pourrait se révéler utile.

    • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

      Posté par  . Évalué à 1. Dernière modification le 05 juillet 2023 à 10:08.

      Il faudrait que ce soit en automatique. C'est un script. Je peut vous donner le script que j'ai fait jusqu'a present :

      HOST=""
      USER=""
      PASS=""
      REPOSITORY=""
      TO_KEEP=(
      
          )
      
      lftp -u $USER,$PASS $HOST <<COMMANDS
      cd $REPOSITORY
      mirror
      exit
      COMMANDS
      find . -type f -name "*.gz" -exec sh -c 'mv "$1" $(dirname "$(dirname "$1")").$(basename "$(dirname "$1")").csv.gz' sh {} \;
      find . -type f ! -name "$TO_KEEP" -delete

      HOST, USER et PASS sont les identifiant pour le serveur ftp.
      REPOSITORY, c'est le repertoire dans le serveur ftp où j'ai les fichier à télécharger.
      TO_KEEP, c'est la liste des fichier à télécharger.

      Ce script marche peut-être, mais le but, ce serait de ne pas tout télécharger, de télécharger que ce qui est dans la liste TO_KEEP.

      • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

        Posté par  . Évalué à 1.

        J'ai oublié un point important : tout les fichier que je dois télécharger ont le même nom. ceul le chemin d'accée change. La liste TO_KEEP est donc composé du chemin des fichier à recuperer

        • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

          Posté par  . Évalué à 4.

          si je comprends bien ta démarche … tu télécharges tout via mirror et ensuite tu déplace des trucs et supprime d'autres ? ?

          Pourquoi ne pas générer au préalable la liste de fichiers à télécharger, et la passer à la commande ftp ?

          Pour vérifier si c'est ta commande lftp qui est incorrecte ou le find, peux-tu ressayer de télécharger sans exécuter l'étape de déplacement/suppression ?

          • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

            Posté par  . Évalué à 1.

            Je télécharge tout, je les rennome tous avec leur repertoire parent et grand-parent, puis je suprime ceux qui ne font pas partie de la liste. C'est la seule maniére que j'ai trouvé de le faire pour l'instant, même si c'est pas génial.

            Je ne peut pas mettre la liste avec la commande lftp car c'est la liste des chemin du fichier à télécharger, pas du fichier en lui-même (car ils ont tous le même nom)

            Le problème de cette commande vient de la liste TO_KEEP que je fais de cette manière :
            ("xxxxxxx"
            "xxxxxx"
            "xxxxxx"
            )
            Le problème, est qu'il ne voit que le premier de la liste et pas tout les autres, il suprime donc tout sauf le premier.
            Est ce que je me trompe dans la manière de faire une liste ?

            • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

              Posté par  . Évalué à 3.

              Ok, donc tu confirmes que tu récupères toutes tes données, mais que c'est bien dans le déplacement/suppression que tu as un problème ? C'est ce qui me semblait.

              • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                Posté par  . Évalué à 1.

                Oui, c'est ça. Aprés j'ai aussi le problème que c'est pas très optimisé de tout télécharger et que j'aurait bien voulut télécharger seuleument les fichier à garder mais je sais pas encore comment faire.

                • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                  Posté par  . Évalué à 1.

                  Et le problème est seulement dans la supression, pas dans le renomage

                  • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                    Posté par  . Évalué à 2.

                    ton problème vient à mon avis de la mauvaise utilisation de -name dans find. si j'ai bien compris ta démarche, tu télécharges tout le contenu du ftp, ensuite tu déplaces les fichiers dont tu as besoin, et tu supprimes ceux dont tu n'as plus besoin. Dans ce cas, pourquoi ne pas télécharger tes fichiers dans un dossier de travail, déplacer les fichiers dont tu as besoin dans les dossiers de destination, puis supprimer tout le dossier de travail ?

                    Sinon pour récupérer uniquement ce dont tu as besoin, tu devrais pouvoir générer la liste dans la chaine que tu passes en caractère à lftp. Il me semble avoir déjà fait ça, je regarde.

                    • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                      Posté par  . Évalué à 2.

                      un bout de code dont tu pourrais t'inspirer pour ne récupérer que ce dont tu as besoin, en remplacant la commande cat par la commande lftp et en adaptant un peu le reste.

                      #!/bin/bash
                      
                      TO_KEEP=( tata titi tutu )
                      
                      filename="fichier.txt"
                      
                      GET_SEQUENCE=`for i in ${TO_KEEP[@]}
                      do
                          echo "get ${i}/$filename"
                      done `
                      
                      REPOSITORY=/machin/truc
                      cat <<EOF
                      cd $REPOSITORY
                      $GET_SEQUENCE
                      EOF
                      • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                        Posté par  . Évalué à 1.

                        Si mon filename, c'est un seul et même fichier (car ils ont tous le même nom) et que ce qui va être dans la liste to_keep ressemble à ça : "chemin grand parent/chemin parent" Est ce que ton script pourrait marcher avec ça ?

                        • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                          Posté par  . Évalué à 2.

                          oui. Il faudrait un exemple plus précis par contre. un truc du genre tableau avec une colonne chemin source et une colonne chemin cible.

                          exemple:

                          source cible
                          dir_a/dir_b dir_a/dir_b
                          dir_a/dir_c dir_a/dir_c

                          Je veux juste savoir si les deux colonnes correspondent ou s'il y a un renommage. A partir dde là ce sera un peu plus simple de générer la liste de commandes à passer.

                    • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                      Posté par  . Évalué à 3.

                      petite explication de l'option -name de fin :

                      -name motif
                      Fichier dont le nom de base (sans les répertoires du chemin d'accès), correspond au motif du shell. Les méta-caractères (*',?', et []') ne sont jamais mis en correspondance avec un point.' au début du nom. Pour ignorer un répertoire, ainsi que tous ses sous-répertoires, utiliser l'option -prune ; vous trouverez un exemple dans la description de l'option -path.

                      On ne peut pas passer une liste à l'option -name.

                    • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                      Posté par  . Évalué à 1.

                      Non, je déplace tout, pas seulement ce dont j'ai besoin

            • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

              Posté par  . Évalué à 3.

              Est ce que je me trompe dans la manière de faire une liste ?

              Dans la manière de la créer, non, mais dans la manière d'accéder à ses éléments, oui.

              Une petite explication : https://developpement-informatique.com/article/482/les-tableaux-dans-script-shell ou http://www.ixany.org/fr/articles/introduction-aux-tableaux-en-bash/ ou https://geekflare.com/fr/bash-arrays/

              • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                Posté par  . Évalué à 1.

                Votre script à l'air de plutot bien fonctionner, mais le problème, c'est qu'il ne veut pas télécharger tout les fichier car ils ont le même nom. Il faudrait donc pouvoir les renomer par leur chemin d'accés avant de télécharger celui d'aprés.
                J'ai essayé de cette manière mais cela n'a pas fonctionné :

                echo "get ${i}/$FILENAME | mv $FILENAME ${i}"
                Pouvez-vous me dire comment faire ?

                • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                  Posté par  . Évalué à 2. Dernière modification le 06 juillet 2023 à 11:28.

                  lftp ne permet pas d'exécuter des commandes shell via un tube comme tu souhaiterais le faire. Les enchainements de commandes est une fonctionnalité du shell. Par contre un truc du genre:

                  
                  echo "get ``{mathjax} {i}/filename  `{i}/filename" 
                  
                  
                  

                  devrait faire l'affaire (en supposant que la source et la destinantion aient la même arborescence).

                • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                  Posté par  . Évalué à 2. Dernière modification le 06 juillet 2023 à 13:27.

                  je viens de regarder la manpage de lftp et il est possible de faire un truc du genre :

                  echo "get ${i}/$FILENAME"
                  echo "! mv $FILENAME ${i}"
                  

                  Extrait de la page man :

                  Commands
                   ! shell command
                  Launch shell or shell command.
                   !ls
                  To do a directory listing of the local host.

                  Il suffirait donc d'enchainer, pour chaque fichier, une récupération et un déplacement.

                  • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                    Posté par  . Évalué à 3. Dernière modification le 06 juillet 2023 à 13:28.

                    Ok, merci beaucoup, j'ai trouvé une autre manière de faire finalement :

                    FILENAME="1305619_Products.csv.gz" 
                    GET_SEQUENCE=`for i in ${TO_KEEP[@]}
                    do
                        echo "get -O ${i} ${i}/$FILENAME"
                    
                    done `
                    
                    for j in ${TO_KEEP[@]}
                    do 
                        mkdir -p ${j} 
                    done
                    lftp -u $USER,$PASS $HOST <<COMMANDS
                    cd $REPOSITORY
                    $GET_SEQUENCE 
                    exit
                    COMMANDS
                    • [^] # Re: Ca veut dire quoi "j'ai essayé de plusieurs manières" ?

                      Posté par  . Évalué à 3.

                      Cool, content d'avoir pu aider.

                      Il y a probablement moyen d'améliorer, mais je te laisse chercher. Je pense qu'au fur et à mesure que tu progresseras en programmation shell, tu trouveras des pistes d'améliorations (comme dit le proverbe, c'est en forgeant que l'on devient forgeron). J'espère que ce cas de figure t'auras permis d'en apprendre un peu plus sur la programmation bash.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.