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.

Linked Clones VMs mit VMware vSphere 4

4-mal dasselbe bitte…

Letztens kam mal wieder jemand an und wollte mal eben, aber immerhin nur temporär vier PCs mit der selben Softwareausstattung für einen Datenexport haben. – Gut, er meinte natürlich, dass ich ihm vier VMs anlegen solle. So ist das halt, wenn man mittels Server-Virtualisierungsumgebung schneller als jeder andere in der EDV Abteilung Maschinen bereit stellen kann…

Moment mal…

Da fiel mir ein, dass ich vor einiger Zeit gelesen hatte, dass VMware vSphere (auch ESX 4 genannt) linked Clones beherrscht, also VMs mit einer gemeinsamen virtuellen Basis-Festplatte. – Das hier schien mir der optimale Zeitpunkt das mal auszuprobieren. Gedacht ist die ganze Sache eigentlich wohl für “VMware View”, der Haus-eigenen VDI-Lösung. – Technisch gesehen kann man die API wohl auch “so” ansprechen, und linked Clones oder “Linked Virtual Machines”, wie es offiziell heißt erstellen. Infos hier: Linked Virtual Machines – VMware Technical Note

Die Fertigmischung…

Da es keinen Button oder eine Option in den weiten der Menüs des vCenter Clients dafür gibt (halt nur in View…), wäre wohl Skripten angesagt. Aber auch hier gilt: Man muss ja nicht immer das Rad neu erfinden! – William Lam von yirtuallyGhetto hat das schon erledigt: vGhettoLinkedClone.pl

An die Arbeit

Nulltens

Für das Ganze brauchen wir das “VMware vSphere CLI” aus dem VMware Downdload Center. Weiterhin muss das dort enthaltene Perl-Modul apps\AppUtil.pm im Perl-Suchpfad sein. Bei meiner Standard-Installation unter Windows XP musste ich C:\Programme\VMware\VMware vSphere CLI\Perl\apps\AppUtil berücksichtigen. Der genutzte vSphere/ ESX Server muss außerdem von einem Virtual Center verwaltet werden.

Eine Grundlage schaffen

Wir gewünscht eine Windows XP VM “export1” deployed und die benötigte Software installieren lassen. Hiermit hatten wir schon mal eine VM.

Bitte recht freundlich

Erstmal einen Schnappschuss, äh Snapshot von unserer Basis-VM machen, einfach mit dem vCenter Client. Es macht Sinn einen Namen ohne Lehrzeichen zu verwenden. z.B. “Clone_Basis”

Und jetzt Klonen

Während das Original läuft jetzt auf der Kommandozeile mit dem Perl-Skript einfach die Klone erstellen:

C:\>perl .\vGhettoLinkedClone.pl --server vcenter.mein.netz
--username vcadmin --vmhost esx22.mein.netz --vmname
export1 --vmname_destination export2 --snapname Clone_Basis

Enter password:

Link Cloning virtual machine 'export2' from 'export1' ...

Clone 'export2' of virtual machine 'export1' successfully created.

Das ganze dauerte nicht wirklich lange. Ist ja auch kein Wunder, da ja im Gegensatz zu einer “normalen” Dublette einer VM  ja nicht alle Dateien einmal auf dem Storage kopiert werden müssen, sondern  nur die relativ kleinen Konfigurationsdateien für eine VM erstellt werden, wo die ursprüngliche vHDD Datei als Basis-Disk eingetragen wird und eine vHDD Datei für die zu schreibenden, geänderten Blöcke wie eine Snaphot-Datei eingetragen.

Das Skript eben noch für die weiteren zwei VMs laufen gelassen und fertig.

Et voila

Wenn man sich nun auf dem ESX Host umschaut, sieht man die Platz-Erparniss:

[root@esx22 VMSTORAGE]# ll -h export*
export1:
total 12G
-rw------- 1 root root 2.6G Aug 22 10:46 export1-000001-delta.vmdk
-rw------- 1 root root  294 Aug 22 10:47 export1-000001.vmdk
-rw------- 1 root root  17M Aug 22 11:28 export1-000002-delta.vmdk
-rw------- 1 root root  277 Aug 22 10:46 export1-000002.vmdk
-rw------- 1 root root 1.0G Aug 17 17:42 export1-8d3ef1db.vswp
-rw------- 1 root root  15G Aug 18 11:04 export1-flat.vmdk
-rw------- 1 root root 8.5K Aug 19 13:04 export1.nvram
-rw------- 1 root root 1.1G Aug 18 11:05 export1-Snapshot1.vmsn
-rw------- 1 root root  543 Aug 22 10:52 export1.vmdk
-rw-r--r-- 1 root root  503 Aug 22 11:20 export1.vmsd
-rwxr-xr-x 1 root root 2.7K Aug 22 10:46 export1.vmx
-rw-r--r-- 1 root root  266 Aug 17 17:42 export1.vmxf
-rw-r--r-- 1 root root 216K Aug 17 17:31 vmware-1.log
-rw-r--r-- 1 root root 231K Aug 22 11:21 vmware.log

export2:
total 2.0G
-rw------- 1 root root  1.0G Aug 22 10:56 export2-8d3ef1dc.vswp
-rw------- 1 root root 1009M Aug 22 11:29 export2-delta.vmdk
-rw------- 1 root root  8.5K Aug 22 11:03 export2.nvram
-rw------- 1 root root   387 Aug 22 10:56 export2.vmdk
-rw-r--r-- 1 root root     0 Aug 22 10:56 export2.vmsd
-rwxr-xr-x 1 root root  2.8K Aug 22 11:28 export2.vmx
-rw-r--r-- 1 root root   266 Aug 22 11:15 export2.vmxf
-rw-r--r-- 1 root root  216K Aug 22 10:56 vmware-1.log
-rw-r--r-- 1 root root  113K Aug 22 11:28 vmware.log

export3:
total 2.0G
-rw------- 1 root root 1.0G Aug 22 10:56 export3-8d3ef1dd.vswp
-rw------- 1 root root 993M Aug 22 11:28 export3-delta.vmdk
-rw------- 1 root root 8.5K Aug 22 10:55 export3.nvram
-rw------- 1 root root  387 Aug 22 10:55 export3.vmdk
-rw-r--r-- 1 root root    0 Aug 22 10:56 export3.vmsd
-rwxr-xr-x 1 root root 2.8K Aug 22 11:28 export3.vmx
-rw-r--r-- 1 root root  266 Aug 22 11:14 export3.vmxf
-rw-r--r-- 1 root root 216K Aug 22 10:55 vmware-1.log
-rw-r--r-- 1 root root  63K Aug 22 10:55 vmware-2.log
-rw-r--r-- 1 root root 113K Aug 22 11:28 vmware.log

export4:
total 2.0G
-rw------- 1 root root 1.0G Aug 22 10:53 export4-8d3ef1de.vswp
-rw------- 1 root root 993M Aug 22 11:28 export4-delta.vmdk
-rw------- 1 root root 8.5K Aug 22 10:53 export4.nvram
-rw------- 1 root root  387 Aug 22 10:52 export4.vmdk
-rw-r--r-- 1 root root    0 Aug 22 10:52 export4.vmsd
-rwxr-xr-x 1 root root 2.8K Aug 22 11:27 export4.vmx
-rw-r--r-- 1 root root  266 Aug 22 11:14 export4.vmxf
-rw-r--r-- 1 root root 216K Aug 22 10:52 vmware-1.log
-rw-r--r-- 1 root root 113K Aug 22 11:27 vmware.log

VM export1 belegt 12GB (und würde noch mehr belegen, wenn die vHDD nicht Thin Provisioned wäre) während export2 bis export4 nur 2GB belegen, wovon ein GB jeweils für die beim Einschalten einer jeden VM erstellte Swapdatei in Größe des konfigurierten vRAMs drauf geht…