Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script Bash

    7 mai 2018 à 12:53:24

    Bonjour a tous 

    Je souhaite réaliser un script bash qui compare en BDD si les images d'un dossier spécifique existent,

    voici mon script :

    #!/bin/bash
    
    dbname="intranet_carc_development"
    username="benjamin"
    tab2=( $(ls -ap public/uploads/files | grep -v "/$") )
    test () {
    echo $i
    }
    
    test2 () {
    rm public/uploads/files/$i
    }
    
    for i in ${tab2[*]}
            do
    
    
    psql $dbname $username << EOF
     SELECT CASE WHEN EXISTS (SELECT * FROM public.articles WHERE content LIKE '%$i%') THEN 'existe' ELSE 'suppression de $i....$(test2) ' END;
    
    
    EOF
    
    echo $i
            done
    
    
    
    
    
    
    

    Lors de l'execution du script il differencie bien les images etant en BDD et celle ne l'etant pas : voici le resulat pour une image qui est en bdd et l'autre qui n'y est pas : 

    benjamin@ubuntu:~/GBNA_intranet/intranet.carc$ ./purge_files.sh 
                   case                
    -----------------------------------
     suppression de copie_a.3.png.... 
    (1 row)
    
    copie_a.3.png
      case  
    --------
     existe
    (1 row)
    
    pLDQZ0f8OvFGMfRZS4UqDw.png
    

    jusque la tout vas bien , Cependant, lors de la supressions des image, "THEN $(lancement de la fonction )"

    Bah il supprime toutes les images ...

    Merci de votre aide 





    -
    Edité par BenjaminBarbé 7 mai 2018 à 12:54:25

    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2018 à 15:20:05

      salut,

      je ne connais pas psql.

      par contre, au niveau du script, le tableau ne sert à rien, et la substitution de commande peut générer des erreurs dans les noms des fichiers :

      for f in public/uploads/files/*
      do
         test -f "$f" && psql "$db" "$user" <<eof
      select case ... else '$(rm $f)' end;
      eof
      done


      je trouve bizarre d'effectuer une substitution de commande dans psql.
      il n'y a pas moyen, à la place, d'indiquer, par une fonction psql, un code retour pour psql (à l'instar d'un return pour une fonction) ?

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        7 mai 2018 à 16:33:35

        dantonq a écrit:

        salut,

        je ne connais pas psql.

        par contre, au niveau du script, le tableau ne sert à rien, et la substitution de commande peut générer des erreurs dans les noms des fichiers :

        for f in public/uploads/files/*
        do
           test -f "$f" && psql "$db" "$user" <<eof
        select case ... else '$(rm $f)' end;
        eof
        done


        je trouve bizarre d'effectuer une substitution de commande dans psql.
        il n'y a pas moyen, à la place, d'indiquer, par une fonction psql, un code retour pour psql (à l'instar d'un return pour une fonction) ?


        Bonjour,

        Merci pour ta reponse,

        Si je prend ton exemple, le for va comparer en BDD le nom des fichiers avec le chemin "public/uploads/files...." je me suis donc servis du Tableau pour le grep :)

        Tout de meme si j'adapte ton code mais en utilisant le tableau cela donne   : 

        benjamin@ubuntu:~/GBNA_intranet/intranet.carc$ ./purge_files.sh 
        rm: cannot remove 'fyPq0TsDemhhhbkywRbJaQ.jpeg': No such file or directory
               case        
        -------------------
         le fichier existe
        (1 row)
        
        rm: cannot remove 'k3yrdQrHvr5YfOPHbgI7uw.png': No such file or directory
               case        
        -------------------
         le fichier existe
        (1 row)
        
        rm: cannot remove 'QWMeGlbFxq2TVHWozTCA2g.png': No such file or directory
               case        
        -------------------
         supp en cours... 
        (1 row)
        

        (je ne prend pas en compte le fait qu'il ne trouve pas le fichier ) Le plus bizarre dans tout ça c'est que le script veux absolument supprimer tous les fichier alors que seulement le dernier devrait être supprimé (il y a le petit message supp en cours ...)

        SELECT CASE WHEN EXISTS (SELECT * FROM public.articles WHERE content LIKE '%$file%') THEN 'le fichier existe' ELSE 'supp en cours... $(rm $file)' END;

        j'ai cherché pour utiliser une fonction psql mais aucuns resultats, il y a surement la solution quelque part, c'est seulement que je ne la trouve pas..

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          7 mai 2018 à 17:31:57

          rm ne trouve pas de fichiers parce que le tableau ne contient que les noms des fichiers, pas leur chemin, que la fonction, elle, ajoute !

          il vaut mieux utiliser les globs du shell (comme je l'ai montré), que ls.
          de même, lorsqu'on remplit un tableau avec des noms de fichiers, il vaut mieux faire une boucle for sur le répertoire, et tester que ce sont des fichiers, plutôt qu'une substitution de commande qui risque d'éclater les noms en fonction de l'IFS. :o

          je ne suis, par ailleurs, pas sûr que ce soit psql qui exécute la suppression des fichiers : la substitution de commande à lieu dans le document en ligne (entre les eof).
          ce qui expliquerait que tous les fichiers sont supprimés. :(

          -
          Edité par dantonq 7 mai 2018 à 17:34:43

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            16 mai 2018 à 12:00:57

            Voici mon code a present :

              GNU nano 2.5.3                   File: purge_files.sh                                              
            
            #!/bin/bash
            
            dbname="intranet_carc_development"
            username="benjamin"
            
            
            for f in public/uploads/files/*
                    do
            
            psql $dbname $username << EOF
            
            
            SELECT CASE WHEN EXISTS (SELECT * FROM public.articles WHERE content LIKE '%$f%') THEN 'le fichier e$
            
            
            EOF
            
                    done
            
            
            
            
            
            
            
            
            

            Le problème est qu'il y a 2 fichiers qui existent et un qui n'existe pas, cependant lors de l’exécution du script tous les fichiers sont supprimés

            merci 

            • Partager sur Facebook
            • Partager sur Twitter
              16 mai 2018 à 12:57:57

              pour vérifier que le code de retour de psql change selon que l'enregistrement existe (ou pas) :
              for f in "$chemin"/*
              do
                 if test -f "$f"
                 then
                    psql $dB $user -c 'select * from table where field like "%$f%"' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
              done
              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                17 mai 2018 à 11:07:45

                Tout d'abord merci pour ton aide , donc voici le résultat a présent  :

                #!/bin/bash
                
                db="intranet_carc_development"
                user="benjamin"
                chemin="public/uploads/files"
                
                for f in "$chemin"/*
                do
                if test -f "$f"
                then
                psql $db $user -c 'select * from public.articles where content like "%$f%"' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
                fi
                done



                et la console me retourne :

                ./purge_files.sh 
                ERROR:  column "%$f%" does not exist
                LINE 1: select * from public.articles where content like "%$f%"
                                                                         ^
                public/uploads/files/3W8tzRk2bLMcVXoX5TAUig.pdf n'a pas été trouvé : je supprime
                ERROR:  column "%$f%" does not exist
                LINE 1: select * from public.articles where content like "%$f%"
                                                                         ^
                public/uploads/files/b--QuF4yPobetjIqogMiyw.jpeg n'a pas été trouvé : je supprime
                ERROR:  column "%$f%" does not exist
                LINE 1: select * from public.articles where content like "%$f%"
                                                                         ^
                public/uploads/files/Dp_HlC39gEany7tcsxD1iA.png n'a pas été trouvé : je supprime
                ERROR:  column "%$f%" does not exist
                LINE 1: select * from public.articles where content like "%$f%"
                                                                         ^
                public/uploads/files/HetHDbPNEsiKNl_3pKb8ng.png n'a pas été trouvé : je supprime
                ERROR:  column "%$f%" does not exist
                LINE 1: select * from public.articles where content like "%$f%"
                                                                         ^
                public/uploads/files/KRxoOUsN5FktZuyszSjw4A.png n'a pas été trouvé : je supprime
                ERROR:  column "%$f%" does not exist
                LINE 1: select * from public.articles where content like "%$f%"
                                                                         ^
                public/uploads/files/_nVevDz_u31x28LyWRxllA.png n'a pas été trouvé : je supprime
                

                j'ai 2 prob ducoup : 

                -le fait que le for selectionne le chemin 

                -et que le like ne marche pas ..

                -
                Edité par BenjaminBarbé 17 mai 2018 à 11:26:29

                • Partager sur Facebook
                • Partager sur Twitter
                  17 mai 2018 à 12:32:11

                  l'expansion des variables se fait dans les chaines encadrées par des guillemets, pas dans celles qui ont des apostrophes

                  $ name="Bond, James Bond"
                  $ echo "My name is $name"
                  My name is Bond, James Bond
                  $ echo 'My name is $name'
                  My name is $name
                  


                  Du coup, pour avoir des guillemets dans une chaine entre guillemets, faut ruser

                  $ echo "My name is \"$name\""
                  My name is "Bond, James Bond"
                  

                  à coup de \ pour déspécialiser les guillemets internes à la chaine.

                  -
                  Edité par michelbillaud 17 mai 2018 à 14:46:02

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 mai 2018 à 13:38:33

                    bonjour,

                    #!/bin/bash
                    
                    db="intranet_carc_development"
                    user="benjamin"
                    chemin="public/uploads/files"
                    
                    for f in "$chemin"/*
                    do
                    if test -f "$f"
                    then
                    
                    #test1
                    psql $db $user -c 'select * from public.articles where content like png' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
                    
                    #test2
                    psql $db $user -c 'select * from public.articles where content like "png"' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
                    
                    
                    
                    fi
                    done

                    J'ai meme essayer avec ton astuce mais a chaque fois il me dit que la colum n'existe pas 

                    public/uploads/files/r-BntUPF69PI79KdjtS-_Q.jpeg n'a pas été trouvé : je supprime
                    ERROR:  column "png" does not exist
                    LINE 1: select * from public.articles where content like png
                                                                             ^
                    public/uploads/files/rlo0ewRDXTnNZZFXidiGew.jpeg n'a pas été trouvé : je supprime
                    ERROR:  column "png" does not exist
                    LINE 1: select * from public.articles where content like png
                                                                             ^
                    public/uploads/files/SNBwNyO6D_xp235mP69OOw.jpeg n'a pas été trouvé : je supprime
                    ERROR:  column "png" does not exist
                    LINE 1: select * from public.articles where content like png
                    

                    merci 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 mai 2018 à 14:30:48

                      oups. j'ai mis la commande psql sans trop faire attention, en pensant que tu la corrigerais...

                      comme le dit michelbillau, il faut que la variable ne soit pas dans les apostrophes :

                      psql "$db" "$user" 'select...'%"$var"'%' && echo "existe" || echo "n'existe pas"
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                      Script Bash

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown