Forum Programmation.shell problème script projet

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
15
fév.
2016

Bonjour tout le monde!
Tout d’abord je suis ravi d'avoir troué ce forum qui m'a beaucoup aidé dans ma démarche de recherche sur linux^
Bon je vous fais la version courte. J'ai un projet en cours , un truc tout bête mais je suis bloqué depuis deux semaines c'est a rendre fou. En gros, je dois écrire des lignes de codes qui prennent en argument une certaine taille en kilo octet et une ou plusieurs adresses de répertoire et qui donne a la fin la liste des fichier qui sont plus gros que la taille indiqué et donc compressible.
La difficulté étant qu'il faut exclure des résultats tout les fichiers déjà compressés du genre musique , vidéo et son. Et donner a la fin l'arborescence finale des fichier compressibles.

pour l'instant ce qu'on a trouvé se limite a ca :

find $1 -size +$2k -type f -exec file '{}' ';'

Je sais que ça fait beaucoup pour une première requête mais je suis vraiment , vraiment en galère et je trouve nulle part la réponse :o si quelqu'un a une idée je lui en serait reconnaissant a vie :o :D

merci encore pour votre attention :)

  • # c'est deja pas mal

    Posté par  . Évalué à 3.

    find $1 -size +$2k -type f -exec file '{}' ';'

    ta commande fonctionne ?
    ca donne quoi comme resultat ?

    est-ce qu'un |egrep -v 'mp4|mp3|video|whatelse' ne suffirait pas à supprimer des resultats tous les fichiers donc file retourne que c'est un mp3 OU un mp4 OU une video OU whatelse …

    • [^] # Re: c'est deja pas mal

      Posté par  . Évalué à 1. Dernière modification le 15 février 2016 à 23:26.

      Salut!
      merci pour ta réponse déjà
      alors avec ma commande j'ai bien les fichier qui sont plus lourd que la taille rentrée et leur type , mais j'arrive pas a virer les .avi ou .mp3 par exemple :/

      et le soucis de ta commande c'est que dans mon énonce ( je l'ai pas précisé désolé), je n'ai pas le droit de me fier au suffixe des fichiers. En gros je ne peux pas cibler et virer par exemple les mp3, mp4 ou autre , je dois trouver un moyen de retirer de la liste les fichiers audio , vidéo et son en fonction de leur type directement.

      Par exemple si je modifie le nom d'un fichier image et que je lui accorde un .txt , il ne va pas le virer de la liste alors qu'il faudrait :/

      • [^] # Re: c'est deja pas mal

        Posté par  . Évalué à 2.

        le egrep c'est le filtre,
        utilise le sur les mots que tu veux

        si la reponde de file c'est Audio-wave-xxx-yyyy
        tu peux tres bien filtrer sur xxx ou yyyy

        man egrep pour en savoir plus

        • [^] # Re: c'est deja pas mal

          Posté par  . Évalué à 1.

          Alors , la commande egrep aduio|video|image , a bien marché. J'ai plus dans ma liste les fichier son et tout.
          Mais je ne trouve toujours pas la commande permettant de m'afficher l'arborescence complète des fichier obtenus :/

      • [^] # Re: c'est deja pas mal

        Posté par  . Évalué à 3.

        Pour déterminer au doigt mouillé le type d'un fichier : "file $fichier".
        Courage !

    • [^] # Re: c'est deja pas mal

      Posté par  . Évalué à 1.

      Tu crois que juste rajouter après le egrep Audio|video|image suffirait? :)
      Et tu connais une commande qui permet d'afficher en même temps l'arborescence des fichiers cible?

      • [^] # Re: c'est deja pas mal

        Posté par  . Évalué à 2.

        le filtre agit sur le nom de fichier, via son extension.

        Ce que tu proposes n'a aucun impact, sauf si tes fichiers finissent par .Audio ou .image

        • [^] # Re: c'est deja pas mal

          Posté par  . Évalué à 1.

          ca a bel est bien retiré les fichier audio , image et video pourtant :o

      • [^] # Re: c'est deja pas mal

        Posté par  . Évalué à 2. Dernière modification le 16 février 2016 à 12:08.

        Et tu connais une commande qui permet d'afficher en même temps l'arborescence des fichiers cible?

        je ne vois pas le probleme, ta premiere commande suivi d'un egrep JPEG

        ./BOC2015/006.jpg: JPEG image data, progressive, precision 8, 960x540, frames 3
        ./BOC2015/009.jpg: JPEG image data, JFIF standard 1.02, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 960x253, frames 3
        ./BOC2015/016.jpg: JPEG image data, JFIF standard 1.02, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 960x540, frames 3

        on a donc bien l'arborescence : BOC2015
        et le nom du fichier 006.jpg

        donc si tu ne veux pas les JPEG tu fais un egrep -v JPEG
        mais le resultat doit etre similaire

        /chemin/fichier: info sur le fichier

        • [^] # Re: c'est deja pas mal

          Posté par  . Évalué à 1. Dernière modification le 16 février 2016 à 12:34.

          En effet j'ai l'arborescence des fichiers mais elle n'est pas complète. Je veux dire, elle ne remonte pas jusqu’à home par exemple :o

        • [^] # Re: c'est deja pas mal

          Posté par  . Évalué à 1.

          j'ai pensé a un "find /" , mais le problème c'est que ça me donne l'arborescence mais pour tout les fichier de l'ordi ^ alors que je voudrais que ça cible juste les résultats du find précédent et me donne leur arborescence :/

          • [^] # Re: c'est deja pas mal

            Posté par  . Évalué à 2.

            je ne sais pas quel version de find tu as, mais chez moi
            find /home ....

            m'affiche le resultat comme ca :

            /home/userA/Documents/fichierA
            /home/userA/Documents/fichierB
            /home/userB/dossierZ/fichier

            sinon, ton script a l'air de prendre le dossier de recherche en argument ($1)
            donc tu sais deja d'ou tu pars,
            find affiche alors les chemins relatifs ce dossier.

            le chemin complet à afficher est donc $1/$resultat

            • [^] # Re: c'est deja pas mal

              Posté par  . Évalué à 1.

              Bonsoir!!
              Alors merci beaucoup mon projet a fait un pas de géant! haha
              mais j'ai toujours un soucis…
              je m'explique , je veux insérer au debut de la commande une boucle for qui permettra d'indiquer si les dossiers dans le(s)quel(s) la recherche est effectuée existe(s) ou pas.
              J'ai donc opté pour une boucle if
              if [ !-d "$*" ]
              then
              echo "Attention , dossiers inexistants"
              fi

              Or quand je lance la commande . Quelque soit la situation ( si le dossier rentré existe ou pas ) , mon echo s'affiche! :/

              Je me demande alors si j'ai fais une erreur ou si ca vient d'autre part

              • [^] # Re: c'est deja pas mal

                Posté par  . Évalué à 2.

                vu que tu fais ton find avec $1
                pourquoi ne fais-tu pas

                if [ ! -d $1 ]
                then
                echo "attention ..."
                else
                find $1 -size $2k -type f ....
                fi
                • [^] # Re: c'est deja pas mal

                  Posté par  . Évalué à 1. Dernière modification le 19 février 2016 à 21:15.

                  Mince!! j'ai oublié de préciser les changement que j'ai du opérer!
                  J'ai du changer mon "dollar1" en "dollar*" pour rentrer plusieurs adresses. (vive les énoncés chiant de projet prog…)

                  • [^] # Re: c'est deja pas mal

                    Posté par  . Évalué à 2.

                    soit, mais du coup, à quel moment choisis tu la taille ?

                    dans ton enoncé d'origine, c'etait
                    $1 = le dossier
                    $2 = la taille

                    et tu faisais un find $1 -size $2 -type f -exec ......

                    ce qui evidemment ne va plus fonctionner avec un $* qui va prendre tous les parametres

                    • [^] # Re: c'est deja pas mal

                      Posté par  . Évalué à 1.

                      Je vais écrire tout ce que j'ai trouver jusqu'a maintenant ce sera plus facile ^

                      /bin/bash

                      echo 'entrer la taille minimale'
                      read -r n

                      find dollar* -size +"dollarn"k -type f 2>/dev/null -exec file '{}' ';' |egrep -v 'Audio|video|etc…'

                      voila
                      tout fonctionne très bien , excepté le fait que je veuille inclure ma boucle if qui ne fonctionne pas justement

                      • [^] # Re: c'est deja pas mal

                        Posté par  . Évalué à 2.

                        donc ton cas c'est :

                        #!/bin/bash
                        
                        echo 'entrer la taille minimale'
                        read -r n
                        
                        find $* -size +$nk -type f 2>/dev/null -exec file '{}' ';' |egrep -v 'Audio|video|etc…'

                        on a donc $n pour la taille et $* pour les dossiers.

                        dans la definition que tu donnes, tu decris

                        ìf [ test ]
                        then
                          actionA
                        fi

                        comme entant une boucle,
                        or cela n'en est pas une, c'est juste une CONDITION, d'ailleurs en francais (en algoritmie) on ecrit :

                        SI condition
                        ALORS
                          actionA
                          actionB
                        SINON
                         action C
                        FINSI

                        si tu veux faire une boucle sur tous les dossiers contenu dans $*, en algoritimie on ecrirait plutot :

                        POUR TOUT dossier dans $*
                        FAIRE
                          actionA sur $dossier
                        FINPOUR

                        evidemment rien ne t'empeche de cumuler ce qu'on vient de voir pour obtenir ton programme "intelligent"

                        ecrire "saisir la taille minimale"
                        lire variable_taille
                        
                        POUR TOUT dossier dans $*
                        FAIRE
                          SI $dossier n'existe pas
                          ALORS
                            ecrire "ATTENTION..."
                          SINON
                           chercher dans $dossier les fichiers dont la taille est superieure à $variable_taille et executer un traitement
                          FINSI
                        FINPOUR
                        • [^] # Re: c'est deja pas mal

                          Posté par  . Évalué à 1.

                          donc d’après ce que tu m'as expliqué j'ai essayé de traduire tout ça

                          for d in $*
                          do
                          if [ ! -d "$*" ]
                          then
                          echo "marche pas "
                          else
                          find etc grep etc…
                          fi
                          done

                          or…(ça aurait été trop beau si ca fonctionnait du premier coup ) j'ai obtenu que deux "marche pas" sortis de nulle part quand je rentre les bons paramètres :(

                          • [^] # Re: c'est deja pas mal

                            Posté par  . Évalué à 2.

                            l'idée et bonne, le code l'est presque

                            dans ton if, il faut utiliser la variable d que tu as créé plus haut (dans le for), sinon tu n'as rien changé à ton probleme de depart.

                            for D in $*
                            do
                              if [ ! -d $D ]
                              then
                                echo "marche pas"
                              else
                                find $D -size $nk -type f -exec .....
                              fi
                            done
                            • [^] # Re: c'est deja pas mal

                              Posté par  . Évalué à 1.

                              j'y crois pas….depuis tout ce temps c'était une inversion des arguments…
                              merci , merci!! MERCI!! tu m'a permis de me coucher 2h plutôt cette nuit!
                              et vive le shell \o/

                              • [^] # Re: c'est deja pas mal

                                Posté par  . Évalué à 2.

                                depuis tout ce temps c'était une inversion des arguments

                                ce n'est pas une inversion d'arguments,

                                c'est avoir confondu une CONDITIOIN (if xxx then yyy) avec une BOUCLE (for xxx in a b c;do action sur xxx;done)

        • [^] # Re: c'est deja pas mal

          Posté par  . Évalué à 3.

          Ce serait plus robuste de faire un "file --mime-type" suivi d'un "grep -v image/".
          Je te laisse trouver un moyen d'améliorer ça pour ne pas exclure des fichiers qui se trouvent dans un répertoire appelé image sans pour autant être des images.

Suivre le flux des commentaires

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