5 votes

sha1sum des fichiers dans un répertoire

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

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

Les retours :

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

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

Je pense qu'en utilisant sha1sum $i | awk '{print $1}' est la solution, mais je ne sais pas comment obtenir uniquement le nom du fichier.

5voto

steeldriver Points 118154

À mon avis, l'approche la plus simple serait de passer d'abord dans le répertoire, dans un sous-shell :

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

Notez que *.* ne correspond qu'aux fichiers avec une extension "point" - à la somme de contrôle tous il suffit d'utiliser *


Si vous choisissez d'opter pour la awk l'une des approches consisterait à sub stitue la plus longue sous-chaîne jusqu'à un / du deuxième champ :

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

2voto

Sergiy Kolodyazhnyy Points 97292

Il suffit d'utiliser find avec -exec drapeau 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 -printf "%f\t" et exécutez Shell à l'intérieur de -exec en passant le chemin du fichier réel comme argument de ligne de commande au Shell lui-même.

Bien que cela semble un peu complexe, cela fonctionne sur un chemin arbitraire passé à find et il n'est donc pas nécessaire de cd autour du système de fichiers

Une meilleure mise en forme peut être obtenue avec une variante de la commande ci-dessus, qui inverse la position des éléments suivants -printf y -exec drapeaux :

$ 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X