web-dev-qa-db-fra.com

sha1sum de fichiers dans un répertoire

J'ai un script qui renvoie le sha1sum de chaque fichier dans un répertoire avec le chemin complet du fichier.

for i in /path/to/directory*.*; do sha1sum $i >> checksums.txt; done

Résultats:

sha1sum  /path/to/directory/filename
sha1sum  /path/to/directory/filename2
sha1sum  /path/to/directory/filename3

Comment puis-je modifier cela de sorte que la sortie ne contienne que le sha1sum et le nom de fichier. Je ne veux pas imprimer le chemin complet du fichier.

Je figure en utilisant sha1sum $i | awk '{print $1}' est la voie à suivre, mais je ne sais pas comment obtenir uniquement le nom du fichier

4
user627497

A mon humble avis, l’approche la plus simple consisterait à passer au répertoire en premier, dans un sous-shell:

(cd /path/to/directory ; for i in *.*; do sha1sum "$i" ; done) >> checksums.txt

Notez que *.* ne fait correspondre que les fichiers avec une "extension de point" - à la somme de contrôle tous fichiers, utilisez simplement *


Si vous choisissez la route awk, une solution serait alors de substituer la sous-chaîne la plus longue jusqu'à un / du deuxième champ:

for i in /path/to/directory/*.*; do sha1sum $i ; done | awk '{sub(/.*\//,"",$2)} 1' >> checksums.txt
4
steeldriver

Utilisez simplement la commande find avec le drapeau -exec comme ceci:

$ find ./TESTDIR -type f -printf "%f\t" -exec bash -c 'sha256sum "$@" | awk "{print \$1}"' sh "{}" \; 
out.txt cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325
2.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
with space.txt  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
script.pl   e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
3.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
Steam_locomotive    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
storm carl  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
1.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
sal e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
simple_curl e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

La façon dont cela fonctionne est que nous imprimons d'abord le nom de base avec le drapeau -printf "%f\t" et exécutons Shell à l'intérieur du drapeau -exec avec le chemin du fichier réel en tant qu'argument de ligne de commande pour le Shell lui-même.

Bien que cela semble un peu complexe, cela fonctionne sur un chemin arbitraire passé à la commande find, donc pas besoin de cd autour du système de fichiers

Un meilleur formatage peut être obtenu avec une variante de la commande ci-dessus, qui inverse la position des drapeaux -printf et -exec:

$ find ./TESTDIR -type f -exec bash -c "sha256sum '{}' | awk '{printf  \"%s\t\",\$1}' " \; -printf "%f\n"
cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325    out.txt
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    2.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    with space.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    script.pl
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    3.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    Steam_locomotive
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    storm carl
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    1.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    sal
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    simple_curl
2