10 votes

Comment md5 une liste de chemins de fichiers contenus dans un fichier ?

J'ai un dossier contenant de nombreux dossiers contenant de nombreux fichiers. Des milliers.

Je peux le faire. find . -type f > ./FILE-LISTING.TXT pour créer un fichier contenant plusieurs milliers de chemins de fichiers qui ressemble à ceci :

./Anders/Letters/20190101 Rent.pdf
./Anders/Letters/20190103 Appeal.pdf
./Anders/Letters/20190107 Decision.pdf
./Beeker/Letters/20180101 Rent.pdf

Comment pourrais-je introduire cette liste de chemins de fichiers dans md5 pour produire une sortie formatée comme ceci :

9cf14e4d666dcb6aab17763b02429a19 ./Anders/Letters/20190101 Rent.pdf
d1bb70baa31f1df69628c00632b65eab ./Anders/Letters/20190103 Appeal.pdf
7a0f5bc18688fe8ba32f43aa6ec53fb1 ./Anders/Letters/20190107 Decision.pdf
a0c96a79cf3b1847025d9f073151519d ./Beeker/Letters/20180101 Rent.pdf

NB : Je veux les hachages md5 des fichiers référencés, pas le md5 de la liste des fichiers, ni les hachages md5 des chaînes de caractères dans le fichier file-listing.txt.

De même, serait-il plus rapide de tout faire en une seule ligne de commande, ou de le faire en deux passes ( find pour créer le fichier file-listing.txt, puis md5 pour créer file-listing-md5.txt) ?

3 votes

C'est une superbe question - claire, qui pose quelques défis, mais qui va être très faisable puisque chaque outil d'automatisation sur MacOS doit gérer les espaces dans les noms de fichiers, les boucles et les variables pour gérer le changement de fichier en cours de traitement. Bien joué - j'espère que nous aurons d'excellentes réponses en Python, bash, swift et autres options de scripting.

3 votes

Quel est votre cas d'utilisation de ce fichier ? mtree est un outil déjà disponible pour surveiller les hachages de fichiers et détecter les changements de noms de fichiers, de contenus de fichiers, de permissions ou d'horodatage. man mtree pour les détails. mtree -c -K md5digest

0 votes

Le cas d'utilisation est de remettre un fichier de hachages et de chemins de fichiers à un SGBDR tiers qui suit un grand nombre de détails supplémentaires non présents dans le système de fichiers. Si les fichiers sont déplacés, ils peuvent être réassociés. Si le fichier est modifié sur place, il peut être reconnecté.

12voto

nohillside Points 82672
find . -type f -exec /sbin/md5 -r {} +
       ^^^^^^^ ^^^^^ ^^^^^^^^^^^^ ^^ ^
          |      |        |       |  |
          |      |        |       |  +- add as many file names as possible per call
          |      |        |       +---- replace with names of found files
          |      |        +------------ command to run
          |      +--------------------- execute following command
          +---------------------------- find any "normal" file

devrait faire l'affaire (et régler les problèmes habituels avec les espaces, etc. dans les noms de fichiers).

Quant à la rapidité, une passe est presque toujours plus rapide que deux passes. Dans ce cas précis, le calcul MD5 prend tellement de temps que les autres facteurs peuvent très probablement être ignorés.

PS : Coup de chapeau à @lhf pour m'avoir rappelé de <code>-r</code>

4 votes

@nohillside et @lhf ont tous deux fourni de bonnes et valables réponses. Sur un coup de tête, j'ai décidé de voir si l'une est sensiblement meilleure que l'autre. J'ai exécuté les deux sur un répertoire contenant plus de 64 000 fichiers sous le nom de time . Le site find -exec était environ 3 secondes plus rapide que la version find | xargs . Cependant, le temps d'exécution pour les deux était d'environ 45 secondes, ce qui signifie que (a) la différence est inférieure à 10% et (b) le temps est probablement lié aux E/S (impression sur la console).

0 votes

C'est presque certainement lié aux E/S (mais pas pour l'impression à la console, il doit digérer tous ces fichiers, ça va prendre du temps).

0 votes

@CraigS.Cottingham Il y a à peu près autant de fichiers, mais dans des répertoires profondément imbriqués - et non pas dans un seul répertoire - ce qui pourrait expliquer pourquoi la ligne de commande dont j'ai hérité prend environ 15 minutes minutes pour courir. La prochaine fois que je serai sur place, je ferai aussi une comparaison.

9voto

Igor Zelaya Points 2266

Essayez ça :

find . -type f -print0 | xargs -0 md5 -r

Note -print0 y -0 pour gérer les espaces dans les noms de fichiers.

Par rapport à find . -type f -exec cette solution fonctionne md5 beaucoup moins fréquemment, bien que cela puisse ne pas avoir un impact mesurable.

2 votes

find 's -exec {} peut également gérer les espaces dans les noms de fichiers.

2 votes

@nohillside et @lhf ont tous deux fourni de bonnes et valables réponses. Sur un coup de tête, j'ai décidé de voir si l'une est sensiblement meilleure que l'autre. J'ai exécuté les deux sur un répertoire contenant plus de 64 000 fichiers sous le nom de time . Le site find -exec était environ 3 secondes plus rapide que la version find | xargs . Cependant, le temps d'exécution pour les deux était d'environ 45 secondes, ce qui signifie que (a) la différence est inférieure à 10% et (b) le temps est probablement lié aux E/S (impression sur la console).

0 votes

Merci de l'avoir testé !

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X