web-dev-qa-db-fra.com

Comment utiliser GNU parallèle pour calculer le hachage sha256?

Sur cette base: calculer simultanément plusieurs résumés (md5, sha256)?

J'ai un dossier contenant un grand nombre de fichiers pour lesquels je souhaite calculer le hachage SHA256.

J'ai l'habitude de coder le segment:

#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done

actuellement pour calculer le hachage sha256 en parallèle, sauf que mon ordinateur ne dispose que de 16 cœurs physiques.

Donc, la question que j'ai est de savoir comment puis-je utiliser GNU parallèle pour exécuter cela, mais uniquement en utilisant les 16 cœurs physiques dont je dispose sur mon système et qu'une fois le hachage terminé , il récupérera automatiquement le prochain fichier à hacher?

8
alpha754293

Utilisation de xargs (et en supposant que vous disposez d'une implémentation de cet utilitaire qui prend en charge -0 et -P):

printf '%s\0' * | xargs -0 -L 1 -P 16 sh -c 'sha256sum "$1" > "$1".sha' sh

Cela passerait tous les noms du répertoire courant en tant que liste terminée par nul à xargs. L'utilitaire xargs appelle un script sh en ligne pour chacun de ces noms, démarrant au plus 16 processus simultanés. Le script en ligne prend l'argument et exécute sha256sum dessus, sortie du résultat dans un fichier de nom similaire.

Notez que cela pourrait également récupérer .sha fichiers créés lors d'une précédente exécution du même pipeline. Pour éviter cela, utilisez un glob légèrement plus sophistiqué que * pour correspondre aux noms particuliers que vous souhaitez traiter. Par exemple, dans bash:

shopt -s extglob
printf '%s\0' !(*.sha) | xargs ...as above...

Notez également que l'exécution de sha256sum sur des fichiers volumineux en parallèle est susceptible d'être lié au disque plutôt que lié au CPU et que vous pouvez éventuellement voir une vitesse de fonctionnement similaire avec un plus petit nombre de tâches parallèles.


Pour un équivalent GNU parallel, remplacez xargs par parallel.


Dans le shell zsh, vous pouvez le faire comme

autoload -U zargs
setopt EXTENDED_GLOB

zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh
8
Kusalananda

Avec GNU parallel, vous pouvez éviter complètement la boucle Shell et simplement lancer:

parallel -P 16 sha256sum {} ">"{}.sha ::: *

Cela s'exécutera sha256sum sur chaque fichier (ou répertoire, mais c'est ce que votre script a fait) renvoyé par le glob * et enregistrez la sortie dans fileName.sha. Par exemple:

$ ls
file1  file2  file3  file4  file5
$ parallel -P 16 sha256sum {} ">"{}.sha ::: *
$ ls
file1      file2      file3      file4      file5
file1.sha  file2.sha  file3.sha  file4.sha  file5.sha

Cependant, gardez à l'esprit ce que @Kusalandanda a souligné à propos du principal goulot d'étranglement dans ce genre de chose étant les E/S et pas nécessairement le CPU. Vous voudrez peut-être exécuter moins de 16 en parallèle.

6
terdon