*nix: Eingabeumleitung

Wurde zum Thema Eingabeumleitung bei Linux gefragt.

  • „>“: Damit wird Text, der an die Standardausgabe geschickt wird, in eine Datei geschrieben. Die Datei wird überschrieben.
  • „>>“: Damit wird Text, der an die Standardausgabe geschickt wird, an eine bestehende Datei angehängt. Die Datei wird NICHT überschrieben.
  • „|“: Nimmt Text, der an Standardausgabe anliegt, und liefert ihn an Standardeingabe.
  • „<„: Liest eine Datei und liefert den Text dann an die Standardeingabe. Recht ähnlich zu „|“.

Vlt. durch Beispiele klarer.

$ date > datum.txt

Da wurde das Programm „date“ aufgerufen und dessen Ausgabe (also die akt. Uhrzeit und Datum) wurde in die Datei „datum.txt“ geschrieben. In datum.txt stände also jetzt z.B.:

$ cat datum.txt 
Fre Sep 18 12:14:56 CEST 2009
$ date > datum.txt

Datum wird wieder in „datum.txt“ geschrieben. Der alte Inhalt von „datum.txt“ ist verloren gegangen.

$ cat datum.txt 
Fre Sep 18 12:15:59 CEST 2009
$ date >> datum.txt
$ cat datum.txt 
Fre Sep 18 12:15:59 CEST 2009
Fre Sep 18 12:16:22 CEST 2009

Durch das „>>“ wurde die Ausgabe von „date“ an die bestehende Datei angehängt. Das anschliessende „cat“ zeigte, das die Datei nicht überschrieben wurde.

$ find $HOME/Bilder -type f -exec md5sum {} + | sort

find $HOME/Bilder -type f -exec md5sum {} +„: Suche im Ordner „$HOME/Bilder“ alle Dateien („-type f„) und rufe für jede gefundene Datei „md5sum“ auf („-exec md5sum {} +„). Übergebe dann das Ergebnis der ganzen md5sum Aufrufe an „sort„. Zum übergeben wurde „|“ verwendet.
Das könnte man z.B. machen wollen, um exakt identische Bilder/Dateien zu finden, die aber vlt. unterschiedliche Namen haben.

Beispiel Ausgabe von md5sum:

$ md5sum /Windows/Lotus/NotesR6/kpjpgrdr.dll /Windows/Lotus/NotesR6/kpjpgwrt.dll
4d56b98c8c3bd65e2003e3faa973fe15  /Windows/Lotus/NotesR6/kpjpgrdr.dll
98dfbac7c0e14d6c42241f51fc0eb51f  /Windows/Lotus/NotesR6/kpjpgwrt.dll

Die erste Spalte (also 4d5… und 98d…) sind eine „Quersumme“ über den Dateiinhalt – gleicher Inhalt ergibt gleiche md5 Summe.

$ while read dateiname; do exiv2 -v -r '[%Y-%m-%d--%H.%M.%S] :basename:' rename "$dateiname" ; done < dateiliste.txt

Was wurde da gemacht? Nun, ich selber habe gerne bei meinen Dateinamen von Bildern der Digitalkamera auch noch im Dateinamen selber drin stehen, wann das Bild gemacht wurde. Digitalkameras legen diese Information im sog. EXIF Header ab. „exiv2“ ist ein Tool, das diesen Header auslesen kann und dann Dateien passend umbenennen kann – in diesem Beispiel würde [2009-09-18–12.27.52] vor den Originaldateinamen gestellt.

Ich habe da exiv2 zig mal aufgerufen. Und zwar habe ich vorausgesetzt, das es eine Liste von Dateinamen gibt und diese Liste liegt in der Datei „dateiliste.txt“. Wichtig ist hierbei der Befehl „read„. read liest von der Standardeingabe jeweils eine Zeile und weist das gelesene einer Variable zu (die ich „dateiname“ genannt habe).

$ cat dateiliste.txt | while read dateiname; do exiv2 -v -r '[%Y-%m-%d--%H.%M.%S] :basename:' rename "$dateiname" ; done

Das macht das gleiche wie das Bsp. eins weiter oben, ist aber „Pfui! Bah!“:) , da es ein UUoC (Useless Use of Cat) ist. Der Aufruf von „cat“ ist darum useless, da man die Shell auch direkt anweisen kann, von einer Datei zu lesen (durch die Verwendung von <, siehe Beispiel oben!). Bei der Toolbox for IT gibt’s auch noch ein vlt. eingängieres Bsp. für UUoC.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s