Forum Linux.debian/ubuntu Script pour vérifier si une chaîne de caractère existe dans le magic number

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
24
juil.
2019

Bonjour à tous,

J'aimerais copier tous les fichiers ayant un magic number identiques (tout du moins le début) au même endroit.
J'essaye donc de copier tous les fichiers ayant un début de magic number identique.

Mon problème est que lors de l'exécution, le find copie tous les fichiers shell. Ce que je voudrais c'est de copier tous les fichiers ayant un magic number correspondant à la boucle if et non les .sh
Voici mon code :

#!/bin/sh

if [ 'xxd -l 0x06 ~/Desktop/test.sh' | find . -type f -exec grep 00000000: 2321 2f62 696e {} \; ]
    then find /home/user/ -iname "*.sh" -exec cp -t /home/user/Desktop/dossierFinal '{}' \;
    else echo "marche pas"
fi

Je cherche une solution mais je ne la trouve pas. Je vous remercie de votre aide.

  • # Lit tes cours / demande à ton prof ?

    Posté par  (site web personnel) . Évalué à 2.

    Bonjour,

    ceci ressemble fortement à un exercice / devoir de formation … et ton code est un assemblage hétéroclite de commandes incomprises, je ne suis pas certains que demander à d'autres de faire ton taf soit très utile …

    Anyway, as-tu clairement identifier l'algorithme qui formera la structure de ton programme ? (clairement commencer par un 'if' n'est pas bon signe).

    • [^] # Re: Lit tes cours / demande à ton prof ?

      Posté par  . Évalué à 1. Dernière modification le 24 juillet 2019 à 14:26.

      Non pas exactement, j'ai 53 ans. J'ai un vieux PC que j'ai récupéré. Je voudrais voir tous les scripts qui existent un peu partout et contrôler si certains peuvent poser des problèmes. Voilà le but de ma démarche.

      Je ne suis pas très très calé en script. J'ai quelques bases et quelques recherches sur internet. Cela m'a ammené à ce script là.

      Il y a juste la ligne du "then find" qui ne fonctionne pas. D'où la demande d'aide car je n'arrive pas avec mes recherches à faire ce que je souhaite (copier tous les fichiers avec un même magic number).

      • [^] # Re: Lit tes cours / demande à ton prof ?

        Posté par  (site web personnel) . Évalué à 2. Dernière modification le 24 juillet 2019 à 17:01.

        Non pas exactement, j'ai 53 ans. J'ai un vieux PC que j'ai récupéré. Je voudrais voir tous les scripts qui existent un peu partout et contrôler si certains peuvent poser des problèmes. Voilà le but de ma démarche.

        Ok désolé

        Il y a juste la ligne du "then find" qui ne fonctionne pas.

        ce n'est pas le problème principal de ton script, il est pensé à l'envers et incorrect même dans son test initial.

        Je vais assumer que les quotes dans << 'xxd -l 0x06 ~/Desktop/test.sh' >> sont une erreur de saisie ici

        Tu a écris:

        • Si j'extrais les 6 premiers octets du fichier ~/Desktop/test.sh que j'envoi à find (qui n'en a rien à faire) auquel je demande de chercher des fichier et d'executer grep sur ces fichiers pour rechercher la chaine "00000000:" dans les fichiers 2321, 2f62, 696e et le fichier trouvé
          • Alors je cherche tout les fichiers .sh dans /home/user et je les copies dans /home/user/Desktop/dossierFinal

        Voila a peu prêt comment ce traduit ton script initial.

        Tu as déjà une proposition de solution, une autre serait:

        find $path -type f -exec /bin/sh -c "xxd -l 6 -ps {} | grep -q 23212f62696e && echo {}" \;

        => find recherche tout les fichiers
        je lui dit pour chaque résultat de lancer un shell qui va executer "xxd" pour convertir les 6 premiers octets en hexa, sous un format condensé car pas besoin d'autre chose que la data brute, le résultat va être envoyé à grep et si ça match la chaine souhaitée le nom du fichier sera affiché.

        Il suffirait de remplacer 'echo' par la commande de copie.

        • [^] # Re: Lit tes cours / demande à ton prof ?

          Posté par  . Évalué à 2. Dernière modification le 24 juillet 2019 à 20:50.

          A noter que si la clef se situe au même endroit dans les fichiers, il n'est pas utile de la passer à grep .

           [ "`xxd -l 6 -s 0 -ps {}`" = "23212f62696e" ] && cp {} ailleurs/

          devrait faire l'affaire. Ici, la clef se trouve en début de fichier ( -s 0 ).

          Pour donner tout ça à manger à find , il est plus facile de décomposer le tout:

          #!/bin/sh
          
          where=/home/david
          to=/home/david/test
          for i in `find ${where} -type f `; do
              m=`{mathjax} ( xxd -l 6 -s 0 -ps "`{i}" )         
               [ "`{mathjax} m" = "23212f62696e" ] && cp "`{i}" "${to}/"
          
          done

          Par contre, cela ne prend pas en charge les fichiers avec des espaces dans le nom.

          Ceci se traduit par,

          • pour chaque fichier trouvé dans where, le stocker dans i
          • récupérer les 6 premier octets de ce dernier
          • comparer ces octets à clef
          • si correspondance, copier le fichier dans to

          Il y a un bug dans l'affichage du code, les simple quotes sont interprétées.
          Des mathjax apparaissent

          • [^] # Re: Lit tes cours / demande à ton prof ?

            Posté par  (site web personnel) . Évalué à 3. Dernière modification le 25 juillet 2019 à 08:01.

            En même temps, quelle idée d'utiliser `commande` au lieu de $(commande) ? :)

            C'est probablement une histoire de goût/habitude, mais que ça soit pour la lisibilité ou la facilité d'imbrication, je conseille chaleureusement la deuxième forme.

            Pour les histoires de gestion d'espace, si on est parti pour faire une boucle, pourquoi s'amuser à utiliser for qui déclenche un découpage par mot plutôt que de passer par un while qui découpe par ligne ?

            Debian Consultant @ DEBAMAX

            • [^] # Re: Lit tes cours / demande à ton prof ?

              Posté par  . Évalué à 2. Dernière modification le 29 juillet 2019 à 20:18.

              En même temps, quelle idée d'utiliser commande au lieu de $(commande) ? :)

              C'est historique et portable, l'équivalence $() n'existe pas sous (t)csh par exemple.
              L'idée est de modifier la profondeur de l'interprétation à l'intérieur des guillemets, en usant de guillemets différentes.

              pourquoi s'amuser à utiliser for qui déclenche un découpage par mot plutôt que de passer par un while qui découpe par ligne ?

              Je préfère utiliser directement la sortie de find en appelant un script de traitement par fichier, passé à exec ; ( et surtout pas exec +).

  • # Une écriture un peu différente

    Posté par  (site web personnel) . Évalué à 2. Dernière modification le 24 juillet 2019 à 15:00.

    Je te propose la structure suivante, qui devrait te permettre de travailler sereinement :

    find /un/point/de/départ -type f | while read f; do
      echo "Je suis en train de travailler sur $f"
      if xxd -l 0x06 "$f" | grep -qs '^00000000: XXXX YYYY ZZZZ'; then
        echo "$f correspond au motif recherché"
      else
        echo "$f ne correspond pas"
      fi
    done
    

    i.e. tu demandes à find de te dresser la liste de tous les fichiers, et tu fais une boucle dessus, fichier par fichier. Pour chacun, tu peux faire les tests de ton choix.

    Il est probable que tes fichiers .sh ne correspondent pas au magic number recherché, mais tu pourrais de toute façon les exclure en ajoutant un filtre sur le nom à l'appel find : ! -name '*.sh'

    Debian Consultant @ DEBAMAX

    • [^] # Re: Une écriture un peu différente

      Posté par  . Évalué à 1.

      Merci Cyril de ta réponse.

      Je vais travailler et je reviendrai si je n'y arrive pas dans quelques jours. Mais normalement ça devrait le faire.

Suivre le flux des commentaires

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