.sha Datei mit > 10.000 Einträgen prüfen lassen + gescheite Fehlerausgabe

S

Sharptype

Aktives Mitglied
Thread Starter
Dabei seit
23.05.2015
Beiträge
1.181
Reaktionspunkte
112
Moin zusammen,

ich habe eine .sha Prüfsummendatei mit über 10.000 Prüfeinträgen:

Code:
SHA1CHECKSUM  DATEIPFAD
SHA1CHECKSUM  DATEIPFAD
SHA1CHECKSUM  DATEIPFAD
SHA1CHECKSUM  DATEIPFAD
...

Weiß jmd wie ich diese Datei am einfachsten und mit brauchbarer Fehlerausgabe bei falschen Checksums überprüfen/durchlaufen lassen kann?
Idealerweise mit Boardmitteln.

http://osxdaily.com/2012/02/05/check-sha1-checksum-in-mac-os-x/
Hier ist irgendwie nur beschrieben, wie das mit einer Datei geht, die als Parameter (bzw. der Pfad) direkt übergeben wird, aber bei mir sind ja alle in dieser Datei gesammelt. :rolleyes:

Für jeden Tipp dankbar :)
 
Code:
shasum -c dings.sha | grep -v ': OK'
 
  • Gefällt mir
Reaktionen: Sharptype
Oman entweder hab ich die "man" page nicht verstanden oder ich hab das einfach überlesen :rolleyes: Sorry dafür, aber das mit "grep" wäre gleich die nächste Frage gewesen :dance:

Jetzt hab ich aber noch ein Problem :heul:

Die Dateipfade in der Datei sind relativ angegeben mit einem Sternchen davor, z. B. so:

Code:
SHA1CHECKSUM  *Ordner\Unterordner\Datei.xyz

Da die Datei automatisch produziert wird, wäre es natürlich schön, wenn MacOS das irgendwie schlucken würde :rolleyes:

Gibt es da eine Möglichkeit oder wird es auf Suchen+Ersetzen (manuell vorher) hinauslaufen?
Die MAN page gibt auf jeden Fall nichts diesbezüglich her und das Starten in der obersten Ebene bevor die Relativität der Pfade los geht führt leider auch zu Fehlern.

Ansonsten ist es aber schon mal eine mega Hilfe, danke dafür!
 
Code:
shasum -c <(sed -e 's,\\,/,g' -e 's/\*Ordner/Ordner/' dings.sha) | grep -v ': OK'
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: clusterix, Sharptype und Malice 313
WTF, Olivetti du Profi...Das muss ich mir jetzt erstmal in Ruhe angucken und verstehen :cake: ...und lernen!
Wäre der Hammer, wenn ich das so speichern kann und dann diese Datei damit regelmäßig durchballern kann :upten:
 
shasum -c <(sed -e 's,\\,/,g' -e 's/*Ordner/Ordner/' dings.sha) | grep -v ': OK'
Ok ich habs mir gerade mal versucht in mein Brain zu hämmern :hamma:

shasum -c bekommt den Input aus dem über sed modifizierten Fileinput dings.sha und grep filtert nach allen die NICHT (-v) ": OK" enthalten, also fehlerhafte Ausgabe eben. Richtig?

Bez. "sed" ziehst du zwei Reg-Expr.-Funktionen an und ersetzt
1. Den Backslash in meinen Files durch einen Slash (erste Backslash ist "escaped") zusätzlich mit dem Flag "g" (overlapped), was ich noch nicht ganz geschnallt habe hinsichtlich was "g" genau macht
2. Dann die eigentlich wichtige Operation indem "*Ordner" durch "Ordner" ersetzt wird. "Ordner" wäre dann also mein absoluter und vollständiger Pfad bzw. der Rooteinstiegspunkt, bevor die Pfadrelativität aller Pfade in der sha Datei los geht.

Hab ich das halbwegs richtig kapiert (hab alles gerade nur nachgelesen und recherchiert und versucht zu verstehen)? :kopfkratz:



BTW für alle, die mal hier drauf stoßen (war für mich einfacher zu verstehen als die man-page): https://de.wikipedia.org/wiki/Sed_(Unix)
 
alles korrekt. :p
das hintere g ersetzt global, also alle vorkommnisse in der jeweiligen zeile (hier sämtliche \ zu /).
wenn du g weglässt, wird nur die erste fundstelle ersetzt (hier im zweiten segment das erste passende *Ordner).
 
  • Gefällt mir
Reaktionen: Sharptype
Alles klar. So ganz zum Laufen bekomme ich es noch nicht.

Man muss das Sternchen noch escapen und dann bekomme ich die Fehlermeldung:
"no properly formatted SHA1 checksum lines found"

Getestet habe ich die Einzelteile und mir auch in eine Datei geschrieben und die sieht so aus, wie sie aussehen soll. Ich habe mir auch eine Testdatei von shasum selbst generieren lassen, die (abgesehen von den zwei!!! Leerzeichen zwischen Summe und Pfad) identisch zu dem manipulierten Input "shasum -c" ist.

Hänge da jetzt schon gefühlt 2 Stunden dran :mad::confused:

Check das irgendwie nicht.
 
Kapier ich nicht, jetzt funktioniert es :D

Hier das Ergebnis:

Code:
shasum -c <(sed -e 's,\\,/,g' -e 's/ \*/  \/Users\/User\/Documents\/Test\//' Checkfile.sha) | grep -v ': OK'

Meeeeegaaa vielen Dank @Olivetti! Ich hau das jetzt in den Automator und mach ne App draus zum Anklicken :bedjump:

:skate:
 
  • Gefällt mir
Reaktionen: clusterix
es müssen 2 leerzeichen sein.
und du kannst die sed-trennzeichen beliebig wählen, dann musst du nicht soviel escapen (siehe 's,,,g' und 's///g').

stimmt, den stern sollte man auch noch escapen, falls evtl. extended REs verwendet werden – hab's geändert.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Sharptype
Ich versuche das gerade als Dienst in den Finder zu integrieren.

Aktuell habe ich:

Code:
on run {input, parameters}
   set i to item 1 of input

   tell application "Terminal" 
       do script "shasum -a1 -c <(sed -e 's,\\\\,\\/,g' -e 's/ \\*/  \\/Users\\/User\\/Documents\\/Test\\//' " & i & ") | grep -v ': OK'"
   end tell

   return input
end run

Das ganze musste hier noch x mal escaped werden. Bis ich das rausgefunden hatte :D:rolleyes:

Jetzt stehe ich vor dem Problem, dass "i" als Variable den Pfad der ausgewählten sha-Datei im Finder mit Punkten "HD:XYZ:bla:file.sha" zurückgibt :rolleyes: Das frisst der Befehl shasum leider nicht.

Kannst du mir da vielleicht nochmal helfen? :cake:
 
das sollte so gehen:
Code:
set myfile to quoted form of posix path of (i as alias)
dann halt myfile, statt i verbauen.

---
ja, das üble gequote in AS/automator. :crack:
 
  • Gefällt mir
Reaktionen: Sharptype
Läuft :cool:

Super, bin mega happy! Danke für die professionelle Hilfe @Olivetti ! :cake:

:skate:
 
  • Gefällt mir
Reaktionen: mausfang
Code:
on run {input, parameters}
  
   set i to item 1 of input
   set myfile to quoted form of POSIX path of (i as alias)
  
   tell application "Terminal"
      
       do script "shasum -a1 -c <(sed -e 's,\\\\,\\/,g' -e 's/ \\*/  \\/Users\\/User\\/Documents\\/Test\\//' " & myfile & ") | grep -v ': OK'"
   end tell
  
   return input
end run

:reise:
 
das ist ein konversionsproblem. deine datei kommt ja aus windows. wenn du es dort nicht beheben kannst, bleibt 1. LANG setzen, wie im link die erste antwort ("LC_ALL=C shasum ..." / so wirkt das nur zur laufzeit des scripts und sonst nirgends) oder 2. gnu sed verwenden.

gnu sed würde ich dir empfehlen, falls du öfter mit sed hantieren willst. für's erste reicht aber LANG setzen und gefährlich ist das nicht. :p
 
und gefährlich ist das nicht.
haha war vielleicht etwas dämlich von mir formuliert...was ich meinte ist, dass ich keine Variable in einem Skript setzen möchte, die dann systemweit und dauerhaft plötzlich gilt und mir nachher noch irgendwas zerschießt :)

Aber das Skript müsste ich öfters starten, daher statt "sed" im Skript einfach "gnu sed" verwenden und ansonsten alles so lassen?
 
nein, bau "LC_ALL..." ein und gut. das wirkt nur auf das script. gnu sed nimmst du dann, wenn du dich generell mehr mit sed beschäftigst und die beispiele aus dem netz nachvollziehen willst. ausserdem müsstest du das erst installieren.
 
  • Gefällt mir
Reaktionen: Sharptype
Ja ok alles klar.

Wenn ich jetzt

Code:
LC_ALL=C shasum -a1 -c <(sed -e 's,\\,/,g' -e 's/ \*/  \/Users\/User\/Documents\/Test\//' Check.sha) | grep -v ': OK'

ausführe, bekomme ich wieder den "illegal byte sequence" Fehler (an welcher Stelle weiß ich nicht, da er alle "OK Lines" ja ausblendet bzw. gar nicht erst anzeigt. Und wenn ich

Code:
LC_ALL=C shasum -a1 -c <(sed -e 's,\\,/,g' -e 's/ \*/  \/Users\/User\/Documents\/Test\//' Check.sha)

also nur ohne "grep" ausführe, läuft er bis knapp 8000 Zeilen durch und bricht dann ab, ABER ohne Fehlermeldung (letzte Zeile ist "Filename xyz... OK"). Da fehlen aber noch mehrere tausend weitere Zeilen.Irgendwie seltsam :confused:

Das AppleScript sieht jetzt so aus:

Code:
on run {input, parameters}
 
   set i to item 1 of input
   set myfile to quoted form of POSIX path of (i as alias)
 
   tell application "Terminal"
            
       do script "LC_ALL=C shasum -a1 -c <(sed -e 's,\\\\,\\/,g' -e 's/ \\*/  \\/Users\\/User\\/Documents\\/Test\\//' " & myfile & ")"
    
       set bounds of window 2 to {30, 30, 1400, 900}
   end tell
 
   return input
end run

Bei der o.g. Fehlermeldung ist auch kein "string" drin, dass grep hier irgendeinen Einfluss drauf hätte bei der Darstellung.

Wäre wohl am besten ich würde die Codierung in der Datei selbst in Windows irgendwie ändern. Da bin ich jedoch gerade etwas lost.
 
Zuletzt bearbeitet:
du musst halt die zeilen finden, die das problem verursachen.
häng hinten statt
Code:
| grep...
das
Code:
| cat -n
dran, das nummeriert deine ausgabe.
 
Zurück
Oben Unten