Archives for posts with tag: bash

Beim Kopieren von Fotos stimmt oft das Dateidatum nicht mehr. Manchmal, weil Samba das Datum nicht zurückdatiert, oder weil beim versenden über Bluetooth das Dateidatum beim Erstellen auf dem Rechner aktuell gesetzt wird. Blöd ist das, weil mein Bildbetrachter geeqie nur nach Dateidatum sortieren kann, aber nicht nach Exif-Datum. Selbst geeqie versaut das Datum der Datei, wenn man den Bildinhalt dreht.

Dafür hab ich wieder was gebastelt: Per Script wird aus den Dateien das Erstellungsdatum gelesen und neu gesetzt. Zum Lesen braucht man die exif-tools, zum Setzen des Dateidatums touch -d.

#!/bin/bash
# swg, 6.1.2014
#
# Dateierstellungsdatum auf das in EXIF gespeicherte Datum setzen
# erwartet als Parameter wenigstens eine Bilddatei!
#
ARGS=$@
for JPG in „$ARGS“; do
DATETIME=$(exiftool -DateTimeOriginal -s -s -s -d ‚%F %H:%M:%S‘ „$JPG“);
touch -d „$DATETIME“ „$JPG“;
done

Es lassen sich beliebig viele Dateien übergeben. Wie immer hab ich das Script ins Kontextmenü von geeqie genagelt. Klappt Super.

(swg)

Fürs Bloggen brauch ich immer ewig. Vor allem Bilder Aufbereiten frisst dabei unheimlich Zeit. Macht man das mit Gimp oder ähnlichem wird man drüber adelig. Und man macht dabei eigentlich jedes Mal das Selbe: Bild skalieren, schärfen, benennen – und eventuell nochmal ’ne größere Version davon mit dem Selben Spielchen. Jaja, ich könnts auch WordPress machen lassen. Unterwegs mit UMTS kommt es aber eher nicht so gut, 10 MP-Bilder hochzuladen. Der Traffic kostet, mein Volumen beträgt gerade mal 150 MB pro Monat – ich bin halt geizig.

Wenn man eh immer das Selbe macht, könnte das doch auch der Rechner selber machen, oder? Zeit für ein Bash-Script! Das hab ich schon vor fast drei Jahren gedacht und mir einen kleinen Helfer gebastelt und getauft: IMG-Helpr. Das Ding war hemdsärmelig zusammengebappt:

  • Imagemagicks display zeigt eine Vorschau des Bildes,
  • Zenity zeigt grafische Dialoge für die Frage nach dem Namen, der eventuellen Drehung und ob man ne große Version zum Verlinken will und
  • Imagemagicks convert skaliert das Bildchen dann.

Sieht dann so aus (habich montiert, die Dialoge kommen natürlich nacheinander).Sowas zu schreiben ist recht unkompliziert, wenn man das auf dem eigenen Rechner benutzt. Will man so ein Script aber auf Fremde loslassen, muss man um alles herumprogrammieren. Man glaubt nicht, was Anwender sich an Dreistigkeiten ausdenken können! Dateinamen mit Leerzeichen zum Beispiel. Deswegen hab ich das Teil heute mal etwas zivilisiert und forsch Version 0.1 behauptet. Jetzt erstmal viel Spaß mit meinem kleinen Blogger-Helferlein IMG-Helpr. Über so ein paar Detaillösungen schwatze ich später mal in diesem Blog.

(swg)

QR-Codes aus Bildern lesen und den Text anzeigen.

Unter Linux gibt es nicht so viele Möglichkeiten, QR-Codes auszuwerten. Eine Möglichkeit auf der Kommandozeile ist ZBar, leider hat es keine GUI. Was ich will soll per Rechtsklick aus meinem Dateimanager funktionieren und mir anschließend in einem Dialog anzeigen, ob und was zbar gefunden hat.

Endlich mal wieder ein Bash-Script… Ein paar Dinge sind Voraussetzung: Als erstes braucht es ZBar zum Auslesen der QR-Codes. Mit Zenity kann man grafische Dialoge in einem Bash-Script anzeigen. Mehr ist nicht nötig.

Es kann dem Script als Parameter ein oder mehrere Bilder übergeben werden. Eine while-Schleife liest & entfernt die Übergabe-Parameter solange, bis keine mehr da sind. Sollte der ermittelte Code mit http:// beginnen, wird er als Webadresse interpretiert: Der dann folgende Dialog bietet an, ihn im Webbrowser zu öffnen.
#!/bin/bash
# swg, 25.8.2013
#
# Verwendet ZBarImg zum Lesen von QR-Codes aus Bildern.
# der ermittelte Text wird in einem Zenity-Dialog angezeigt, mit einer passenden
# Option zur Verwendung (Webadresse-> im Standard-Browser öffnen
#
# erwartet als Parameter wenigstens eine Bilddatei!
#
if [ ! $# -gt 0 ]; then
echo „Usage: zbarimggtk.sh IMG1.jpg [img2.jpg …]“;
exit;
fi;
while [ $# -gt 0 ] # Solange Parameter da sind…
do
IMG=$1;
if [[ -f $IMG ]]; then # ist der Parameter eine reguläre Datei?
CODE=$(zbarimg -Dq $IMG | sed -e „s/QR-Code://“); # vom zbarimg-Rückgabewert
# „QR-Code:“ vorn abschneiden
if [[ -z $CODE ]]; then
zenity –error –text „Kein QR-Code im Bild $IMG gefunden!“ &
else
if [ $(echo „$CODE“ | grep „http://“) ]; then # wenn Code mit „http://“ beginnt,
# ist es eine Webadresse
zenity –forms –title=“Webdresse in $IMG gefunden“ \
–separator=“,“ \
–text=“Webadresse $CODE öffnen?“;
case $? in
0)
x-www-browser $CODE; # Webadresse im X-Standard-Browser öffnen
;;
1)
# User-Cancel!
;;
-1)
zenity –error –text=“Ein unerwarteter Fehler ist aufgetreten.“;
;;
esac
else # bei einfachem Text nur einen Info-Dialog anzeigen
# (Text ist markier- und kopierbar)
zenity –info –title=“Text gefunden:“ –text=“$CODE“ &
fi;
fi;
else
zenity –error –text=“Bild $IMG nicht gefunden!“ &
fi;
shift; # Vordersten Übergabe-Parameter des Scripts löschen
done

Ich verwende es im Rox-Filer und in Geeqie jeweils im Kontextmenü – ein Rechtsklick aufs Bild und das Script als ausführendes Programm gewählt und ich weiß, was mir der fotografierte QR-Code sagen will…

Hier noch das fertige Script:
Symbol Shellscript zbarimggtk.sh

(swg)

Mein Rechner steht im Wohnzimmer und ist damit nicht allein mein persönliches Arbeitsgerät. Er ist Video- & Audio-Player, Messenger, Surfstation uvm. für uns. Ansich ist das kein Problem, was aber nervt ist beispielsweise die Umschalterei am Messenger: Wir haben beide Accounts für XMPP, ICQ und noch ein paar anderen. Pidgin kann das alles. Trotzdem ist es umständlich, jedesmal in die Kontenverwaltung zu seppeln und die jeweiligen Konten zu aktivieren bzw. zu deaktivieren. Einfach den Desktop zwischen Benutzern umzuschalten wär auch möglich, aber nicht minder unkomfortabel, will der andere an sein Zeug.

Je eine separate Instanz Pidgin im Benutzerkontext wär super, mit einem Klick wär das entsprechende Pidgin an oder aus. Die Werkzeuge dafür heißen sudo und xhost.

Als erstes muss /etc/sudoers editiert werden. Der eingeloggte User muss das Ausführen von Pidgin im Kontext des anderen erlaubt bekommen.

swg localhost=(Maria)NOPASSWD:/usr/bin/pidgin

Heißt soviel wie: „Der Nutzer swg darf auf localhost im Kontext von Maria ohne das Passwort eingeben zu müssen das Programm /usr/bin/pidgin ausführen!“.

Eine zweite Hürde besteht jetzt darin, dass der eingeloggte Nutzer seine X-Session exklusiv nutzen darf. Das dient schlicht der Sicherheit. Wär‘ ja doof, wenn jeder von extern eingeloggte da rumkritzeln oder – schlimmer – mitlesen dürfte.

In meinem Fall heißt das, aus dem Kontext Maria muss auf meine X-Session zugegriffen werden dürfen. Die schlichteste Variante ist xhost:

xhost localhost:Maria

Heißt: Nutzer Maria darf vom localhost aus auf meine X-Session. Generell sollte man mit sowas vorsichtig sein, in dem Fall halte ich das aber für unproblematisch. Maria darf sich eh nur lokal anmelden und auch sonst vertrau ich ihr soweit, dass sie hier nix mutwillig zerbröselt ;)

Also: Mit xhost Maria den Zugriff auf mein X erlauben und dann Pidgin mit sudo in ihrem Kontext aufrufen. Die zwei Zeilen hab ich in ein Bash-Script gesteckt

#!/bin/bash
xhost local:Maria;
sudo -u Maria /usr/bin/pidgin;

und auf meinem Desktop verlinkt.MenüFertsch. Sowas geht natürlich auch mit anderen Programmen – Email, Browser, wasweißich. Viel Spaß.

(swg)

PHP Code Snippets Powered By : XYZScripts.com