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?
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
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.