Einfache Frage zu Script / Shell

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
sowosammer
Beiträge: 85
Registriert: 04.11.2002 18:22:26
Wohnort: Berlin

Einfache Frage zu Script / Shell

Beitrag von sowosammer » 09.03.2005 20:49:11

Ich möchte per md5 bzw sha Prüfsummen von mehreren Dateien in einer verschachtelten Verzeichnisstruktur berechnen lassen

Code: Alles auswählen

ls -R | md5sum
führt mich nicht weiter, da für mehrere Dateien nur eine Summe ausgegeben wird.

Wie würdets ihr machen?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 09.03.2005 20:55:54

ich würde das mit folgendem Kommando erledigen:

Code: Alles auswählen

find -type f -exec md5sum {} \;

sowosammer
Beiträge: 85
Registriert: 04.11.2002 18:22:26
Wohnort: Berlin

Jau

Beitrag von sowosammer » 09.03.2005 21:17:19

Ja danke, funktioniert soweit bis auf das du die Pfadangabe vergessen hast, also zb einen Punkt .

Aber ganz grundsätzlich die Frage wie man denn zB per Piping Befehle hintereinanderhängen kann.
Also der erste Befehl produziert eine Liste von Dateien die dann der zweite als Eingabe verwendet.

Mein obiges Beispiel funktioniert eben nicht. Warum?

Benutzeravatar
Mel
Beiträge: 40
Registriert: 28.09.2004 20:39:45
Wohnort: Bonn
Kontaktdaten:

Beitrag von Mel » 09.03.2005 21:33:09

Dein obiger Befehl funktioniert schon...

Code: Alles auswählen

mel@luzie:~$ ls -R|md5sum
ed851e785b4d88a4e8eb364539eeed82  -
Was hier passiert, ist folgendes: ls -R erzeugt eine Liste, die dann komplett an md5sum übergeben wird. Stell Dir einfach mal folgenden Zwischenschritt vor, vielleicht wird's dann etwas deutlicher:

Code: Alles auswählen

 ls -R > liste.txt
md5sum < liste.txt 
Du musst md5sum mitteilen, dass es keinen Hashwert über die gesamte Liste, sondern vielmehr für jeden einzelnen Eintrag der Liste bilden soll.

Gruss,
Mel.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Jau

Beitrag von gms » 09.03.2005 21:34:30

sowosammer hat geschrieben:Ja danke, funktioniert soweit bis auf das du die Pfadangabe vergessen hast, also zb einen Punkt .
habe ich nicht vergessen, den Punkt kannst du dir auch sparen. Bei gnu-find ist Pfadangabe optional
man find hat geschrieben: SYNTAX
find [Verzeichnis] [-Option...] [-Test...] [-Aktion...]



Dein Kommando macht im wesentlichen das gleiche wie dieses Script (/tmp/liste.txt wird hier als Ersatz für die Pipe verwendet)

Code: Alles auswählen

ls - R >/tmp/liste.txt
md5Sum /tmp/liste.txt
del /tmp/liste.txt
Daher hast du genaugenommen die md5 Summe der Verzeichnisliste und nicht der Dateien erstellt.

sowosammer
Beiträge: 85
Registriert: 04.11.2002 18:22:26
Wohnort: Berlin

Re: Jau

Beitrag von sowosammer » 09.03.2005 21:58:29

gms hat geschrieben:
sowosammer hat geschrieben:Ja danke, funktioniert soweit bis auf das du die Pfadangabe vergessen hast, also zb einen Punkt .
habe ich nicht vergessen, den Punkt kannst du dir auch sparen. Bei gnu-find ist Pfadangabe optional
Ich benutz gerade mein iBook mit OS X, also kein GNU find.
Manchmal nerven fehlende bzw. anders funktionierende BSD Befehle. :?
Oder man lernt sogar mehr aus dem anderssein :)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 09.03.2005 21:59:00

@Mel
Deinen Beitrag hatte ich noch gar nicht gesehen. Ich habe im Aufstehen auf "Absenden" gedrückt und bin dann in die Küche marschiert ..

Das war meine erste Version:

Code: Alles auswählen

ls -R >liste.txt
md5Sum liste.txt
Im letzten Augenblick habe ich dann das Verzeichnis eingefügt. Und das "del" ist mir dann auch noch reingerutscht :oops: :oops: :oops:
Naja, ich arbeite beruflich auf sehr vielen Betriebssystemen (Windows, Linux, Aix, SunSolaris) und da passieren solche Verwechslungen schon mal ...

lochkarte
Beiträge: 190
Registriert: 08.12.2004 11:43:44

Re: Jau

Beitrag von lochkarte » 09.03.2005 22:16:33

sowosammer hat geschrieben:Aber ganz grundsätzlich die Frage wie man denn zB per Piping Befehle hintereinanderhängen kann.
Also der erste Befehl produziert eine Liste von Dateien die dann der zweite als Eingabe verwendet.
Ich bin mir nicht ganz sicher, ob ich dich richtig verstehe. Du willst dir für eine Anzahl von Dateien jeweils die md5sum ermitteln? Dann so (entspricht ungefähr der gms-Lösung):

Code: Alles auswählen

find -type f -print0 | xargs -0 md5sum
oder allgemeiner und find-unabhängig:

Code: Alles auswählen

kommando `ermittle_dateinamen_mit_befehl_deiner_wahl`
und dies etwas übersichtlicher:

Code: Alles auswählen

kommando $(ermittle_dateinamen_mit_befehl_deiner_wahl)
Bsp.:

Code: Alles auswählen

$ cat dateiliste
datei1
.gnome
.bash_profile
datei2
$ ls -ld $(cat dateiliste)
ls: datei1: Datei oder Verzeichnis nicht gefunden
ls: datei2: Datei oder Verzeichnis nicht gefunden
-rw-r--r--  1 test test  704 2004-09-08 08:04 .bash_profile
drwx------  6 test test 1024 2004-09-12 22:43 .gnome

Antworten