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 GNU Discussion :

Faire une liste de md5


Sujet :

Shell et commandes GNU

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut Faire une liste de md5
    Bonsoir

    J'aimerai générer un liste des md5 des fichiers d'un répertoires et de ses sous répertoires. J'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find * . -exec md5sum {} \; 2>/dev/null
    Je récupère ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bdb8382a35bc6fe5017ffb9fd60dcf72  common/installed/TomTom-Cfg/release.nfo
    23f2ad75e1fe8e44ad5d5768d7b101cf  common/installed/electric_vehicle_resources/ev_pois/electric_vehicle_stationOv2.ver
    266e217fd77047a5a29444b7d98a300d  common/installed/electric_vehicle_resources/ev_pois/electric_vehicle_station.inf
    99eaa13133365469966ce0a0af160d31  common/installed/electric_vehicle_resources/ev_pois/electric_vehicle_station.rpf
    Mais j'aurais aimé avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bdb8382a35bc6fe5017ffb9fd60dcf72  *common/installed/TomTom-Cfg/release.nfo
    23f2ad75e1fe8e44ad5d5768d7b101cf  *common/installed/electric_vehicle_resources/ev_pois/electric_vehicle_stationOv2.ver
    266e217fd77047a5a29444b7d98a300d  *common/installed/electric_vehicle_resources/ev_pois/electric_vehicle_station.inf
    99eaa13133365469966ce0a0af160d31  *common/installed/electric_vehicle_resources/ev_pois/electric_vehicle_station.rpf
    Il y a une astuce simple en bash ? Ou je dois me faire un petit programme en C ? Juste pour le plaisir de voir une astuce bash...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    déjà on doit pouvoir améliorer juste un chouillat le find find * -type f -exec md5sum {} \;, on ne sélectionne que les fichiers, comme ça on est tranquille.

    ensuite si je comprends bien il s'agit juste de rajouter une astérisque devant le nom de fichier, comme ce qui le précède est de taille fixe on peut s'en sortir assez facilement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find * -type f -exec md5sum {} \; | awk '{print substr($0,1,34) "*" substr($0,35)}'
    la version bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    find * -type f -exec md5sum {} \; | while read line; do
       echo "${line:0:33} *${line:34}"
    done

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Merci

    Tu avais tout bien compris. Ça marche. Par contre, je ne comprends pas exactement tout...

    Je ne vois pas où trouver la doc sur le print, enfin quelque chose de plus clair que le man en anglais.
    Où peut-on trouver une doc sur le "${line:0:33}" ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Encore moi...

    je me suis rendu compte qu'il valait mieux faireun tri dans l'ordre alphabétique des noms. Je n'ai pas trouvé l'option avec find, j'ai donc fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find * -type f |  sort | while read line; do echo `md5sum "$line"`; done | while read line; do    echo "${line:0:32} *${line:33}"; done
    Mais, y a t'il plus simple ?

    (toujours épaté par la force du bash)
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find * -type f -exec md5sum {} \; | sed 's/  /  */' | sort
    D'abord, "find" ne fait pas de tri.

    Ensuite, je trouve louche de mettre * pour cible de "find".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -type f -exec md5sum {} \; | sed 's@  ./@  *@' | sort
    Ces 2 commandes donnent le même résultat, non ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Ces deux commandes génèrent bien le même résultat, mais le tri n'est pas le tri demandé : en fonction du nom du fichier.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Demande la deuxième colonne pour tri.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -type f -exec md5sum {} \; | sed 's@  ./@  *@' | sort -k2
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Non, pas besoin de sed et autre awk, le monsieur veux traiter des fichiers "binaires", donc ceci devrait suffire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -type f -exec md5sum -b {} \; | LC_COLLATE=C sort -k2
    Le LC_COLLATE=C est pour forcer le sort à utiliser la locale C pour le tri et le -k2 pour lui dire de trier sur la deuxième colonne, donc les noms de fichiers.
    Cordialement.

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je viens de voir la différence entre "find" et "find *".
    C'est le "find *" qui me convient. Voici dans l'ordre les deux sorties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    be086323f0bb846946671dc910356b42 *./HELP/.DS_Store
    be086323f0bb846946671dc910356b42 *HELP/.DS_Store
    Donc, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find * -type f -exec md5sum -b {} \; | LC_COLLATE=C sort -k2
    semble convenir.

    Le * apparait à cause du -b de md5sum. Mais, on dirait que ça ne donne rien quant aux fichiers choisis et au md5sum final.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    intuitivement, find * ne me plaît pas.
    je subodore une problème pouvant survenir sur la longueur d'une ligne de commande, parce que c'est le shell qui interprète cet astérisque.
    donc, si tu beaucoup de fichiers dans le répertoire local, avec, en plus, des noms très longs, le noyau va dire "stop : ligne trop longue, blablabla...".

    de plus, moi, j'ai toujours un fichier nommé le bien nommé. et, là, patatras pour les pipes
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rep='./'
    find "$rep" -type f -exec md5sum --binary --zero {} \; | sort --zero-terminated --key=2,2 | xargs --replace={} --null echo "{}" |  sed 's@*'"$rep"'@*@'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Salut

    Comment crées-tu ton fichier "chiant" ?

    Au sort, pourquoi le ,2 au --key2,2 ? Comme tous les fichiers ont tous ./ au début.
    Je ne comprends pas non plus le xargs. Le --remplace remplace quoi exactement ? Le --null est là pour des fichiers qui contiennent quelle(s) sorte(s) d'anomalie(s) ?
    Et le sed n'a pas de / mais des @. Pourquoi ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    dans l'ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > mon'
    'fait'
    'chier
    le > n'est pas le PROMPT du terminal; c'est un opérateur de redirection.

    l'habitude de définir précisément le champ sur lequel doit s'appliquer le tri - ici, du champ #2 au champ #2.

    le replace remplace/"matérialise" l'argument passé sur l'entrée standard de xargs - ici, le nom du fichier.

    le null définit le séparateur d'argument - \0 (NULL) à la place de \n.

    parce que le chemin contient des /, alors sed ne va pas comprendre où commencent et finissent les parties de la substitution.

    autre chose ?
    je peux...?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    parce que le chemin contient des /, alors sed ne va pas comprendre où commencent et finissent les parties de la substitution.

    autre chose ?
    je peux...?
    Oui: autre chose ?
    je peux...?

    Et ça marche aussi avec un fichier "@ussi chi@nt" ?

    Du coup, il me semble que, outre la possibilité (un peu alambiquée et à l'issue pas nécessairement sûre) de chercher (et peut-être trouver) un caractère absent du nom du fichier à utiliser comme séparateur de la substitution de "sed", la solution sécurisée consisterait plutôt à choisir n'importe quel séparateur (par exemple, le "/") et à quoter toutes ses occurrences dans le nom de fichier, non?

    Disons quelque chose comme (partiellement testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rep='./'
    find "$rep" -type f -exec md5sum --binary --zero {} \; | sort --zero-terminated --key=2,2 | xargs --replace={} --null echo "{}" \
      |  sed -e "s/*$(echo "$rep" | sed -e 's|/|\\/|g')/*/"
    ou bien, pour faire plus joli (et plus lisible...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rep='./'
    find "$rep" -type f -exec md5sum --binary --zero {} \; | sort --zero-terminated --key=2,2 | xargs --replace={} --null echo "{}" \
      |  sed -e "s/*$(echo "$rep" | sed -e 's/\//\\\//g')/*/"
    Pour simplifier encore plus, j'imagine qu'on peut aussi utiliser les (tout aussi élégants et lisibles) Remplacements des paramètres (merci N_BaH pour le lien):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rep='./'
    find "$rep" -type f -exec md5sum --binary --zero {} \; | sort --zero-terminated --key=2,2 | xargs --replace={} --null echo "{}" \
      |  sed 's/*'"${rep//\//\\/}"'/*/'
    J'ai encore entendu quelqu'un dire que je pinaillais...

  14. #14
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    (merci N_BaH pour le lien)
    Vous êtes gonflés. C'est le manuel.

    Fonctionne même sans internet.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Si on veut pinailler, on peut se passer aussi du sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rep='./'
    find "$rep" -type f -printf "%P\0" | sort --zero-terminated | xargs --null --replace={} md5sum -b "{}"
    PS: Ma version de md5sum n'a pas l'option --zero.
    Cordialement.

  16. #16
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut

    Cette fois, je commence à être complètement perdu... Le soir avant aller se coucher, ça n'aide pas pour faire une bonne nuit tout ça !

    La variable rep devient inutile dans le dernier. Non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "./" -type f -printf "%P\0" | sort --zero-terminated | xargs --null --replace={} md5sum -b "{}"
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    [HS]
    Citation Envoyé par Flodelarab Voir le message
    man bash fonctionne même sans internet.
    Ouais... C'est pas faux!

    Sauf que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ man bash | wc -l
        4890
    $ echo "$(man bash | wc -l) / $LINES" | bc
    92
    Voilà! Un manuel qui fait 92 pages, j'ai une très légère préférence pour le regarder avec un vrai formatage et des bons outils de navigation (comme: je vois d'un coup d'oeil la liste de tous les chapitres et sous-chapitres et je clique sur celui qui m'intéresse) plutôt qu'en VT100...
    Na!
    [/HS]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire une liste plus jolie de ma liste:lecture de base mysql
    Par CyberTwister dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2006, 23h31
  2. Comment faire une liste d'évènements ?
    Par WebPac dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h36
  3. [VB]faire une liste
    Par kleen3x dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/01/2006, 17h40
  4. Comment faire une liste d'image de choix ?
    Par poussinphp dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/10/2005, 00h34
  5. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h43

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