it-swarm.com.de

sha1sum von Dateien in einem Verzeichnis

Ich habe ein Skript, das die sha1sum jeder Datei in einem Verzeichnis zusammen mit dem vollständigen Pfad der Datei zurückgibt.

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

Kehrt zurück:

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

Wie kann ich das so ändern, dass die Ausgabe nur die sha1sum und den Dateinamen enthält. Ich möchte nicht den vollständigen Pfad der Datei drucken.

Ich denke mit sha1sum $i | awk '{print $1}' ist der Weg zu gehen, aber ich weiß nicht, wie ich nur den Dateinamen bekommen soll

4
user627497

IMHO wäre der einfachste Ansatz, zuerst in das Verzeichnis zu wechseln, in einer Subshell:

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

Beachten Sie, dass *.* nur mit Dateien mit einer 'Punkterweiterung' übereinstimmt - für die Prüfsumme alle Dateien verwenden Sie einfach *


Wenn Sie sich für die Route awk entscheiden, besteht ein Ansatz darin, sub die längste Teilzeichenfolge bis zu einem / des zweiten Felds einzufügen:

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

Verwenden Sie einfach den Befehl find mit dem Flag -exec wie folgt:

$ find ./TESTDIR -type f -printf "%f\t" -exec bash -c 'sha256sum "[email protected]" | 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

Das funktioniert so, dass wir nur den Basisnamen zuerst mit dem Flag -printf "%f\t" drucken und die Shell innerhalb des Flags -exec ausführen und dabei den tatsächlichen Dateipfad als Befehlszeilenargument an die Shell selbst übergeben.

Dies sieht zwar etwas komplex aus, funktioniert jedoch mit einem beliebigen Pfad, der an den Befehl find übergeben wird, sodass das Dateisystem nicht um cd herumlaufen muss

Eine bessere Formatierung kann mit einer Variation des obigen Befehls erreicht werden, bei der die Position der -printf - und -exec -Flags umgekehrt wird:

$ 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