for-Schleife in Kommandozeile/ cmd.exe in Windows über Liste von Ausgaben mit Hilfe von Backticks

Die Linux-Shell kann’s…

Wer kennt’s nicht? – Mal eben in der Linux-Shell die (Standard-)Ausgabe eines Kommandos zeilenweise über eine for-Schleife abarbeiten mittels der unauffälligen Backtick-Zeichen ‘`’, also dieser irgendwie “nach hinten” gekippten einfache Hochkommata?!

Also z.B. alle .JPG-Dateien in einem Verzeichnis in .jpg umbenennen (ja, danke FAT, dass Du keine Groß- und Kleinschreibung unterscheiden kannst…):

david@bree:~$ ll
insgesamt 2256
-rw-r--r-- 1 david users 151022 2010-12-24 15:20 1024_IMG_9239.JPG
-rw-r--r-- 1 david users 250506 2010-12-24 15:20 1024_IMG_9240.JPG
-rw-r--r-- 1 david users 318714 2010-12-24 15:20 1024_IMG_9241.JPG
-rw-r--r-- 1 david users 206009 2010-12-24 15:20 1024_IMG_9242.JPG
-rw-r--r-- 1 david users 266578 2010-12-24 15:20 1024_IMG_9243.JPG
-rw-r--r-- 1 david users 233510 2010-12-24 15:20 1024_IMG_9244.JPG
-rw-r--r-- 1 david users 248728 2010-12-24 15:20 1024_IMG_9245.JPG
-rw-r--r-- 1 david users 189831 2010-12-24 15:20 1024_IMG_9246.JPG
-rw-r--r-- 1 david users 211490 2010-12-24 15:20 1024_IMG_9247.JPG
-rw-r--r-- 1 david users 168863 2010-12-24 15:20 1024_IMG_9249.JPG
david@bree:~$ for f in `ls`; do mv $f `echo $f | sed 's/JPG$/jpg/g'`; done
david@bree:~$ ll
insgesamt 2256
-rw-r--r-- 1 david users 151022 2010-12-24 15:20 1024_IMG_9239.jpg
-rw-r--r-- 1 david users 250506 2010-12-24 15:20 1024_IMG_9240.jpg
-rw-r--r-- 1 david users 318714 2010-12-24 15:20 1024_IMG_9241.jpg
-rw-r--r-- 1 david users 206009 2010-12-24 15:20 1024_IMG_9242.jpg
-rw-r--r-- 1 david users 266578 2010-12-24 15:20 1024_IMG_9243.jpg
-rw-r--r-- 1 david users 233510 2010-12-24 15:20 1024_IMG_9244.jpg
-rw-r--r-- 1 david users 248728 2010-12-24 15:20 1024_IMG_9245.jpg
-rw-r--r-- 1 david users 189831 2010-12-24 15:20 1024_IMG_9246.jpg
-rw-r--r-- 1 david users 211490 2010-12-24 15:20 1024_IMG_9247.jpg
-rw-r--r-- 1 david users 168863 2010-12-24 15:20 1024_IMG_9249.jpg

Die for-Schleife loopt hier einfach mit der Variable f über die Ausgabe des ls-Kommandos und verwurstet nicht einfach den String “ls” als Eingabe. – Dank der ‘`’ Backticks, die das “ls” umschließen.
Ja, und richtig gesehen, auch im Umbenennen zum Ersetzen des Strings “JPG” durch “jpg” mit sed werden sie hier genutzt. Das aber nur nebenbei… Hier geht’s mit eigentlich nur um die for-Schleife über Ausgaben eines Kommandos.

Und jetzt auf DOS

Ok, DOS, also command.com kann es nicht, aber in der nativen Kommandozeile von Windows NT und Nachfahren, der cmd.exe gibt es eine ähnliche Möglichkeit:

for /F " usebackq delims==" %%f in (`dir /B *.JPG`) do (
 move %%f %%f.jpg
)

Und ja, ich weiß, dass a) zum Massen-Umbenennen wohl auch ein “move *.JPG *.jpg” in cmd.exe funktionieren sollte und b) mit obigem Kommando aus a.JPG ein a.JPG.jpg (und nicht a.jpg) würde. – Es geht mit aber nur um ein Beispiel… 🙂

Viel Spaß damit. Für mich war das schon öfter nützlich.

Immer der Stress mit den signierten PGP Keys… – Automagisch neue Signaturen auf PGP Servern veröffentlichen.

Jetzt habe ich soweit alle Leute der letzten PGP Signing Party mit
meinen Signaturen versorgt. – Puh, dank caff aber machbar!

…jetzt bekomme ich aber natürlich auch alle meine PGP IDs (eMail-Adressen…)
unterschrieben von den anderen zugeschickt. Dank caff pro ID eine eMail
von jedem Unterzeichner! – Also z.B. bei meinen 5 IDs und 51 Leuten, die an der
PGP Signing Party teilgenommen haben etwa 250 eMails!!

Jetzt müsste ich um die Signatur in meinen Key zu importieren von jeder
eMail den Anhang entschlüsseln und in eine Datei speichern. – Also
müsste ich den Speichern-Dialog (mit y-Eingabe oder OK-Klicken…) 250
Mal durchlaufen!

Irgendwie habe ich bei den eMail Programmen wie alpine, Evolution und KMail keine
Möglichkeit gefunden von markierten/ ausgewählten eMails die Anhänge in
Dateien zu speichern… :-/ – Wenn jemand weiß, wie das doch geht bitte
ich um Info. 😉

…aber ich habe einen Workaround gebaut:
– Alle “Your signed PGP key…” eMails in einer (MBOX) Datei speichern
(Ich weiß, dass es mit alpine, Evolution, KMail und mutt geht)
– …und einfach das folgende bash-Script “unpack_pgp-sigs.sh” drüber
laufen lassen:
— 8< —

#! /bin/bash

# David Huecking <d.huecking@gmx.net>, 2010-08-31
#
# Quick'n'dirty hack to unpack GPG signatures from eMails stored in mbox
# files.

counter=0
pastepgp=0
pastekey=0

# Loop over mbox file

while read line; do

# If line is
# -----BEGIN PGP MESSAGE-----
# start pasting into a new file
# msg<counter>.pgp
# until and including line
# -----END PGP MESSAGE-----

if [ "$line" == "-----BEGIN PGP MESSAGE-----" ]; then
pastepgp=1
fi

if [ $pastepgp -eq 1 ]; then
echo $line >> msg$counter.pgp
fi

if [ "$line" == "-----END PGP MESSAGE-----" ]; then
pastepgp=0

# Decrypt new msg<counter>.pgp file to
# msg<counter>
gpg msg$counter.pgp

# Extract from msg<counter> the PGP signature
# beginning and including line
# -----BEGIN PGP PUBLIC KEY BLOCK-----
# until and including line
# -----END PGP PUBLIC KEY BLOCK-----
# into new file sig<counter>.asc
while read msgline; do
if [ "$msgline" == "-----BEGIN PGP PUBLIC KEY BLOCK-----" ]; then
pastekey=1
fi

if [ $pastekey -eq 1 ]; then
echo $msgline >> sig$counter.asc
fi

if [ "$msgline" == "-----END PGP PUBLIC KEY BLOCK-----" ]; then
pastekey=0
fi

done < msg$counter

let counter+=1
fi

done < $1

— 8< —

Wenn jetzt noch ein GPG-Agent im Hintergrund läuft, wird man nur einmal
nach seinem GPG-Mantra gefragt und nach ein wenig Rödeln hat man die
PGP-Signaturen in Dateien “sig0.asc” bis “sig<n>.asc” liegen…

Diese kann man dann mit

for f in `ls *.asc`; do gpg --import $f; done

importieren und dann den Key wiederum mit

gpg --send-key

zum PGP-Server hochladen!