Sonntag, 22. November 2009

Linux Suchen und Ersetzen von Dateinamen

Leerzeichen ersetzen durch Strich : find ~ -type f -name '* *' -exec rename 's/ /_/g' {} \;

Einleitung

Das Umbenennen einer einzelnen Datei ist keine grosse Herausforderung. Doch wie ist vorzugehen, wenn man Hunderte oder Tausende von Dateien – z. B. Fotos aus einer Digitalkamera oder die eigene Musiksammlung – in einem einzelnen Ordner oder in vielen Unterordnern umbennen muss? Im grafischen Dateimanager alles markieren und umbenennen funktioniert nicht und jede Datei einzeln umbenennen, dauert viel zu lange. Unter Linux hilft hier «rename» in Kombination mit den sogenannten «perl regular expressions» weiter.

«Reguläre Ausdrücke» sind eine Art «Zwischenabfrage», welche den Dateinamen vor dem eigentlichen Umbenennen durch «rename» analysieren. Für die meisten Aktionen reicht der Zusatz 's/suchbegriff/ersetzung/g' mitzugeben, wobei s für «single line» (Ausdruck muss auf einer Zeile stehen) und g für «global» (ersetzen, sooft der Ausdruck gefunden wird) steht. Soll ohne Unterscheidung von Gross- und Kleinschreibung gesucht werden, dann kann Am Ende noch ein i für insensitive (egal, ob gross oder klein geschrieben) mitgegeben werden.

Teile aus dem Dateinamen entfernen

Es gibt viele Situationen, in denen man Teile des Dateinamens entfernt haben möchte. Bei Musiktiteln will man den Namen des Albums beziehungsweise des Interpreten loswerden, bei Bildern doppelt vorhandene Endungen oder überhaupt zuviele Leerzeichen und Bindestriche.

rename 's/Amelie//g' *
rename 's/Amelie \(Soundtrack\) - //g' *
rename 's/ -//g' *

Das erste Beispiel entfernt das Wort «Amelie», das zweite Beispiel die gesamte Zeichenfolge «Amelie \(Soundtrack\) - » aus dem Namen aller Dateien im aktuellen Verzeichnis. Beachten, dass allfällige Sonderzeichen im Suchbegriff – in diesem Fall die runden Klammern – immer mit einem Backslash gekennzeichnet werden müssen. Das letzte Beispiel zeigt, dass man auch mehrere Leerzeichen problemlos aus dem Dateinamen entfernen kann.

Teile innerhalb des Dateinamens ersetzen

Neben dem Entfernen ungewollter Teile aus dem Dateinamen besteht oftmals auch die Notwendigkeit, einzelne Wörter, Buchstaben oder Zeichen zu ersetzen. wie bereits vorhin erwähnt, muss hier ein besonderes Augenmerk auf das «Escapen» der Sonderzeichen gelegt werden.

rename 's/ /_/g' * oder rename 's/\s+/_/g' *
rename 's/-/./g' *
rename 's/\'/’/g' *
rename 's/^/Amélie_Soundtrack_/' *.ogg
rename 's/ogg$/ogn/' *.ogg

Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche, das zweite alle Bindestriche durch Punkte und das dritte alle falschen Apostrophe durch typographisch richtige im Namen aller Dateien im aktuellen Verzeichnis. Die beiden letzten Beispiele benutzen die Sonderzeichen ^ (= Anfang der Zeile) und $ (= Ende der Zeile), um das Ersetzen auf einen bestimmten Bereich des Dateinamens einzugrenzen; daher kann auch das g für global wegfallen.

Um zu Testen, wie wichtig das «Escapen» der Sonderzeichen ist, versuchen sie einmal die beiden Befehle «rename 's/ /./g' *» und «rename 's/./ /g' *» hintereinander. Auweia! Dummerweise steht der Punkt in den Regular Expressions für "irgendein Zeichen", d. h. der letzte Befehl ersetzt jedes Zeichen im Dateinamen durch ein Leerzeichen! Der korrekte zweite Befehl muss daher «rename 's/\./ /g' *» lauten – und zum Retten der Dateiendung anschliessend noch «rename 's/ ogg$/.ogg/g' *».

Gross- und Kleinschreibung des Dateinamens manipulieren

Die Gross- und Kleinschreibung eines Dateinamens lässt sich ebenfalls sehr einfach mit einem «Einzeiler» ändern, wobei dies den gesamten Dateinamen, aber auch nur Teile davon betreffen kann.

rename 'y/[A-Z]/[a-z]/' *
rename 's/\.JPG/\.jpg/g' *.JPG
rename 's/^\w/\U$&/g' *

Das erste Beispiel ersetzt alle grossgeschriebenen Buchstaben durch kleingeschriebene. Da hier nicht nach einem einzelnen zusammenhängenden Begriff gesucht, sondern ein ganzer Buchstabenbereich analysiert wird und einzelne Zeichen mit einem korrespondierenden Zeichen (eben ein A durch ein a und ein Z durch ein z) ersetzt werden, muss anstelle des s ein y (transliteration) gesetzt werden. Das zweite Beispiel hingegen ersetzt wiederum nur einen einzigen Begriff, nämlich das gross geschriebene «.JPG» durch ein klein geschriebenes «.jpg», daher die bekannte Kombination «'s/ / /g'». Das letzte Beispiel sieht ein wenig komplex aus, ist aber leicht erklärt: es wir nach dem Wort (\w) am Anfang (^) der Zeile (/s) gesucht, dann aber nur der erste Buchstabe ($&) gross geschrieben (\U).

Teile des Dateinamens umbauen und ergänzen

Insbesondere bei grösseren digitalen Bildersamlungen möchte man gerne die nichtssagenden Zahlen im Namen, welche von der Digitalkamera generiert werden, durch aussagekräftige Dateinamen ersetzten. Auch dies ist mit «rename» problemlos möglich.


rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG

Obiges Beispiel nimmt die ersten acht Zahlen (\d{8}) des Dateinamens aller auf JPG-Dateien (\.JPG) und speichert diese für die spätere Weiterverwendung (daher die runden Klammern um \d{8} herum). Der neue Dateiname besteht aus der Bezeichnung «Türkeiferien_» und der vorhin gespeicherten acht Zahlen, die mittels der Variablen $1 angehängt werden; zudem wird die Dateiendung noch in Kleinbuchstaben (\.jpg)umgewandelt. Das zweite Bbeispiel ist sogar noch ein wenig ausgefeilter, denn es speichert nur die letzten drei Zahlen ((\d{3})) des alten achtzahligen Dateinamens, um sie nachher an die Bezeichnung «Türkeiferien_» anzufügen.

Neben dem regulären Ausdruck für «irgendeine Zahl, aber kein Buchstabe» (\d) gibt es natürlich auch noch denjenigen für «irgendeinen Buchstaben, aber keine Zahl» (\w) oder deren Umkehrung «alles, nur keine Zahl» (\D) und «alles, nur keinen Buchstaben» (\W). Leerzeichen können entweder als solche gesetzt werden (siehe erste Beispiele weiter oben) oder aber mit dem regulären Ausdruck \s – oder natürlich auch mit dessen Umkehr \S («alles, ausser Leerezeichen») – aufgespürt werden.

Komplexere Operationen am Dateinamen

Natürlich sind auch komplexere Operationen mit «rename» möglich, welche jedoch ein erweitertes Verständnis der «perl regular expressions» und bisweilen auch einen grossen Zeitaufwand mit sich bringen. Anbei nur ein Beispiel, wie man die Dateigrösse an den Dateinamen anhängen kann:

rename -n 's/$/",size=".(-s)/e' *.jpg

Oftmals sind allerdings umfangreichere Scripts nötig, da viele Linux-Befehle – darunter leider auch «rename» – Ordnerstrukturen nicht rekursiv abarbeiten könne. Hier helfen meistens Schlaufen mit Hilfe des Befehl «find» und Umbennenungen mit «mv» weiter.

Umbenennen ohne rename

Sollte der Befehl «rename» auf dem System nicht vorhanden sein, dann muss auf das Umbenennen mittels «mv» zurückgegriffen werden. Da «mv» keine regulären Ausdrücke versteht, kann hier nur mit den sogenannten «bash string operators» gearbeitet werden. Für das Suchen und Ersetzen gibt es grundsätzlich zwei Wege: eine kürzest mögliche Zeichenfolge rechts (${var%t*string}) oder links (${var#string}) des gefundenen Begriffs her zu ersetzen.

for i in *.jpg; do mv "$i" "${i%t*.jpg}.jpg"; done
for f in Türkeiferien_*; do mv "$f" "${f#Türkeiferien_}"; done

Das erste Besipiel würde aus jeder gefundenen Datei von rechts her zuerst die Endung .jpg ausfindig machen, dann alle Buchstaben von rechts nach links zurückgehend löschen (${i%t*}) und schliesslich den neuen Dateinamen mit der Endung .jpg wieder zusammensetzen. Aus den Dateinamen 001_Türkeifereien, 002_Türkeifereien etc. würden demnach die Dateinamen 001_, 002_ etc.

Das zweite Beispiel würde alle Dateien suchen, die mit «Türkeiferien_» beginnen, danach von links nach rechts alle Buchstaben löschen. Aus den Dateinamen Türkeifereien_001, Türkeifereien_002 etc. würden demnach die Dateinamen 001, 002 etc.

Source : http://www.barmasse.org/linux/bash/rename.html

unix "xargs"


Visit => http://wiki.ubuntuusers.de/Shell/xargs

Unix 'Find' Command

Find ist ein Wunderwuzi unter den Shellprogrammen. Der Name ist Programm, mit find wird gefunden, nicht einfach nur gesucht.

Ein einfaches Beispiel:
Wo in meinem Homeordner liegt die Datei "test.pdf"?
find ~ -name test.pdf
Ihr habt vor ein paar Minuten eilig etwas gespeichert, habt aber den Namen der Datei und den Pfad sofort vergessen.
Irgendwo in eurem Homeordner, irgendein Name, vor ein paar Minuten...
find ~ -type f ! -path '*/.*' -mmin -10 -ls
Die Optionen im Einzelnen:
~ -- rekursiv in meinem Homeordner
-type f -- eine Datei (kein Ordner...)
! -path '*/.*' -- ohne Dateien oder Ordner, die mit Punkt beginnen.
-mmin -10 -- nicht älter als 10 Minuten
-ls -- lange Anzeige (wie ls -l)

Das war noch lange nicht alles...

Variante: mit Dotfiles, nicht aber Ordner, die mit Punkt beginnen (also ohne .gnome/ oder .kde/ usw., aber mit .bash_history). Und zwar alle Dateien, die nicht älter als zwei Tage sind.
find ~ ! -path '*/.*/*' -type f -ctime -2
Im Homeordner alle Dateien finden, deren Namen Leerzeichen enthalten.
Wieder ohne Dateien oder Ordner, die mit Punkt beginnen.
find $HOME ! -path '*/.*' -type f -name '* *'
$HOME -- ist gleichbedeutend mit ~
-name '* *' -- Name enthält mindestens ein Leerzeichen

Ganz ähnlich, aber diesmal wird nach Ordnern gesucht:
find $HOME ! -path '*/.*' -type d -name '* *'
-type d -- Ordner (type directory)

Im Ordner public_html alle HTML und PHP Dateien ausfindig machen, in denen ".mp3" erwähnt wird.
Nur die Dateinamen ausgeben.
find ~/public_html \( -name \*.html -o -name \*.php \) | xargs grep -l '.mp3'
Zu beachten: ( ) * müssen vor der Bash versteckt, also mit Backslash escaped werden.

Andere Methode (-exec statt xargs), gleiches Ergebnis.
find ~/public_html \( -name \*.html -o -name \*.php \) -exec grep -l '.mp3' '{}' \+
Zu beachten: -exec mit \+ abschließen statt mit \; beschleunigt das Abarbeiten ungemein, weil dann mehrere grep Prozesse parallell gestartet werden (vgl. xargs). Setzt eine halbwegs aktuelle Version von find voraus.

Hoppla, da sind auch Dateien mit Leerzeichen im Namen dabei? Kein Problem.
find ~/public_html \( -name \*.html -o -name \*.php \) -print0 | xargs -0 grep -l '.mp3'
finds Option -print0 erzeugt die richtige Ausgabe für xargs Option -0

Anderer Einsatzzweck: Plattenplatz wird knapp, wo sind die großen Dateien?
Also z.B.: in meinem Homeordner alle Dateien, die größer als 500MB sind.
find ~ -size +500M
Nochmal was anderes:
Alle Dateien/Ordner in meinem Homeordner finden, die nicht mir gehören:
find ~ ! -user $( whoami ) -ls
Alle Dateien/Ordner in meinem Homeordner, die root gehören:
find ~ -user root
Alle Dateien/Ordner in meinem Homeordner, die die Rechte auf 777 gesetzt haben,
also Lese/Schreib/Ausführrechte für alle haben, lange Ausgabe wie "ls -l".
find ~ -perm 777 -ls
Welche Art von Dateien (Mimetype) liegen im Ordner Documents, mit Rücksicht auf Dateien mit Leerzeichen im Namen, nur in diesem Ordner, keine Unterordner:
find ~/Documents/ -maxdepth 1 -type f -print0 | xargs -0 file
Find sucht immer rekursiv, es sei denn, man schränkt mit "-maxdepth" die Tiefe ein.


Source : http://spielwiese.la-evento.com/xelasblog/archives/24-Tipps-und-Beispiele-fuer-find.html

Donnerstag, 19. November 2009

Tomcat 6.0 win32 doc root ändern

1) Eine Datei "ROOT.xml" unter conf\Catalina\localhost\ erstellen
2) Folgenden Inhalt einfügen =>
<-context docBase="C:/new/path" reloadable="true"> < / context>
"-" bitte weg machen
3) In der Datei server.xml <-context path="/UnterOrdner" docBase="C:/new/path" reloadable="true"> < / context> Zwischen "Host Tag" einfügen

PS: bei docBase und bei Context Schreibweise beachten !!!

Mittwoch, 18. November 2009

TomCat 6.0v Error

[error] Failed creating java
C:\Program Files\Java\jre1.6.0_07\bin\client\jvm.dll

Lösung (zumindest bei mir).
1) Die Umgebungsvariable JAVA_HOME wenn Sie vergessen haben einfach neu setzen.
JAVA_HOME = C:\Programme\Java\jdk1.6.0_14\bin
2) "msvcr71.dll" von java/bin in den TomCat/bin Ordner kopieren

Viel Spaß !

Donnerstag, 16. Oktober 2008

Systemdatei-Überprüfungsprogramm (Sfc.exe) von Windows XP und Windows Server 2003

Syntax des Systemdatei-Überprüfungsprogramms

/Scannow : Überprüft alle geschützten Systemdateien und ersetzt falsche Versionen durch die richtigen Microsoft-Versionen. Für diesen Befehl ist unter Umständen ein Zugriff auf die Windows-Installationsdateien erforderlich.