Administrator Startseite

Apple

iOS, iTunes, Mac OS X

Entwicklung

BASIC, C und C++, Assembler, Batch & Shell, Bibliotheken & Toolkits, CSS, Datenbanken, HTML, IDE & Editoren, Installation, Java, JavaScript, KiXtart, Lizenzierung, Pascal & Delphi, Perl, PHP, Python, VB for Applications, Visual Studio, Webentwicklung, XML

Hardware

Benchmarks, Cluster, CPU, RAM, Mainboards, Drucker und Scanner, Festplatten, Raid, Grafikkarten & Monitore, LAN, WAN, Wireless, Multimedia & Zubehör, Notebook & Zubehör, Router & Routing, SAN, NAS, DAS, Server-Hardware, Sonstige Peripheriegeräte, Speicherkarten, Switche und Hubs

Internet

Blogs, CMS, Domain Registrierung, E-Books, E-Business, E-Mail, Flatrates, Hosting & Housing, Informationsdienste, Instant Messaging, Onlinedienste, SEO, Server, Soziale Netzwerke, Utilities, Webbrowser

Linux

Apache Server, Debian, Desktop, Netzwerk, OpenOffice, LibreOffice, RedHat, CentOS, Fedora, Samba, Suse, Tools & Utilities, Ubuntu, Userverwaltung

Microsoft

Exchange Server, Hyper-V, Installationsprobleme, Netzwerk, Office, Outlook & Mail, Systemdateien, Tools & Utilities, Userverwaltung, Visual Studio, Windows 7, Windows 8, Windows 10, Windows Phone, Windows Server, Windows Vista, Windows XP

Multimedia

Audio, Digitiales Fernsehen, Grafik, Icons, Schriftarten, Video

Netzwerke

Cluster, DNS, DSL, VDSL, Groupware, Grundlagen, ISDN & Analoganschlüsse, LAN, WAN, Wireless, Monitoring, Netzwerkmanagement, Netzwerkprotokolle, Router & Routing, TK-Netze & Geräte, UMTS, EDGE & GPRS, Voice over IP

Off Topic

Administrator.de Feedback, Humor (lol), Papierkorb

Sicherheit

Backup, Erkennung und -Abwehr, Firewall, Grundlagen, Informationsdienste, Rechtliche Fragen, Sicherheits-Tools, Tipps & Tricks, Verschlüsselung & Zertifikate, Viren und Trojaner

Sonstige Systeme

Google Android, MikroTik RouterOS, Novell Netware, Sun Solaris

Virtualisierung

Hyper-V, KVM, Vmware, Xenserver

Weiterbildung

Aus- und Weiterbildung, Ausland, Schulung & Training, Studentenjobs & Praktikum

Zusammenarbeit

Suche Projektpartner

Vorheriger Wissensbeitrag

Windows 7 Backup
Weniger Werbung?
Cover IT-Administrator
Sie ist aufwendig, kostet Geld und bringt in der Regel keinen unmittelbar sichtbaren Nutzen: Die Client-Security. Dabei ist das richtige Absichern von Rechnern für Unternehmen wichtiger denn je, nehmen doch zielgerichtete Angriffe auf Firmen immer weiter zu. Im Oktober dreht sich im IT-Administrator alles rund um den Schwerpunkt 'Client-Sicherheit & Management'. Darin erfahren Sie unter anderem, wie Sie dank Dateisystemverschlüsselung vertrauliche Daten schützen und mit ... mehr
Kommentar vom Moderator Biber am 18.01.2012 um 19:42:54 Uhr
...weil er kompliziertere Umbennenungen vornehmen will
Set /a rgc += 1
#790
Anmerkung: Da aber bei diesem Thema naturgemäß gefühlte 20x das "Umbenennen" durchkliniert werden musste--> mildernde Umstände
Mitglied: bur2000
18.01.2012, aktualisiert 22:31 Uhr, 10827 Aufrufe, 1 Kommentar, 4

Dateien nach beliebigen Regeln oder RegExp umbenennen per Batch und sed

Die Anleitung bezieht sich auf Windows.

Ab und zu steht man vor dem Problem dass man eine größere Menge an Dateien nach einem bestimmten Schema umbenennen möchte. In weniger komplexen Fällen geht das einfach mit dem ren Befehl (zB ren *.txt *.doc oder ren ab?.* ab?.txt). Sollen aber zum Beispiel alle Großbuchstaben durch Kleinbuchstaben ersetzt werden oder alle Leerzeichen durch Bindestriche reicht ren nicht mehr aus. Dafür bietet sich das Tool sed in Kombination mit dem FOR Befehl an. Da sed ein sehr mächtiges Tool ist sollten damit im Prinzip fast alle denkbaren Umbenennungen durchführen lassen.

1) Wenn nicht vorhanden, sed herunterladen:
sed Download @ sourceforge
sed ist im Prinzip einfach eine sed.exe, ein Kommandozeilen-Tool. Das Setup installiert sed standardmäßig nach %ProgramFiles%\gnuwin32\bin oder %ProgramFiles(x86)%\gnuwin32\bin (für 64bit-Systeme), das Verzeichnis sollte dem Pfad hinzugefügt werden, damit von überall darauf zugegriffen werden kann. Das geht dauerhaft über die Systemsteuerung oder für die jeweilige Eingabeaufforderungssitzung mit path=%path%;%ProgramFiles%\gnuwin32\bin bzw path=%path%;%ProgramFiles(x86)%\gnuwin32\bin.


2) Den sed-Befehl verstehen:
Das Umbenennen erledigt sed, man muss das Tool also bedienen können um den Befehl an seine Bedürfnisse anpassen zu können. Hier sollen nur ein paar Standardfälle erläutert werden, wer wirklich tief in das Programm einsteigen will (oder muss) weil er kompliziertere Umbennenungen vornehmen will, wird um ein Tutorial oder das sed-Manual nicht herumkommen.

Die sed-Befehle werden direkt in der Eingabeaufforderung eingegeben. Dazu muss sed.exe im Pfad stehen (s.o.).

Geht es um simples Ersetzen nach dem Schema ersetze alle 'a' durch 'b' sieht der benötigte sed-Befehl so aus:
sed "s:a:b:g"
Das s steht für substitute, also ersetzen. Dann folgt nach dem ersten Doppelpunkt das Zeichen das ersetzt werden soll und nach dem zweiten Doppelpunkt das Zeichen mit dem wir es ersetzen wollen. Danach folgt noch ein Doppelpunkt (wichtig!). Das abschließende g ist optional und bedeutet dass alle a ersetzt werden sollen. Lassen wir es weg, wird nur der erste Treffer ersetzt.

Wer die Befehle direkt ausprobieren will, kann das am besten so machen:
echo Mein Test-Satz| sed "s:e:a:g"
Hier wäre die Ausgabe Main Tast-Satz.

Um alle Leerzeichen durch Unterstriche zu ersetzen schreiben wir also:
sed "s: :_:g"

Damit lassen sich schon viele Probleme lösen, aber es geht noch mehr:
sed "s:[A-Z]:y:g"
[A-Z] findet alle Großbuchstaben und [a-z] alle Kleinbuchstaben. Im obigen Beispiel werden also alle Großbuchstaben durch 'y' ersetzt. Weitere Möglichkeiten sind [0-9] oder [ahg] um 'a', 'h' oder 'g' zu ersetzen oder [i5ef] um alle 'i', '5', 'e' oder 'f' zu ersetzen, usw. Oder man löscht alle Zahlen und Buchstaben mit sed "s:[0-9a-zA-Z]::g" indem man sie durch "nichts" :: ersetzt.

Wenn man jede Zahl durch # ersetzen möchte könnte man sed "s:[0-9]:#:g" versuchen. Leider macht das aus Meine_Zahl_123 ein Mein_Zahl_### und nicht wie vielleicht erwartet ein Meine_Zahl_#. Dazu gibt es \+. Es findet ein oder mehrere des gewünschten Zeichens:
sed "s:[0-9]\+:#:g"
Das macht dann aus 123 hallo 12 ein # hallo #. Das gleiche funktioniert natürlich auch mit [a-z]\+ um kleingeschriebene Wörter zu finden oder [A-Za-z] um alle Wörter zu finden.

Aber was ist, wenn man zB vor jede Zahl ein Nr. setzen möchte? Mit sed "s:[0-9]\+:Nr.:g" kann ich zwar alle Zahlen durch Nr. ersetzen, aber die Zahl selber soll ja erhalten bleiben. Dabei hilft &:
sed "s:[0-9]\+:Nr. &:g"
Das [0-9]\+ findet alle Zahlen (lässt man das \+ weg, würde vor jede Ziffer ein Nr. gesetzt). Nach dem Doppelpunkt folgt Nr. &. Der Trick ist das & - es steht für den zuvor gefundenen String. In unserem Fall also eine beliebig lange Zahl. Aus "123" wird also "Nr. 123" und aus "Hallo 1 und 23" wird "Hallo Nr. 1 und Nr. 23".

Zu guter Letzt noch zwei nützliche Befehle \L und \U. Damit wandelt man Buchstaben in Kleinbuchstaben (Lowercase) bzw Großbuchstaben (Uppercase) um:
sed "s:[A-Z]:\L&:g"
Das [A-Z] findet alle Großbuchstaben und ersetzt sie durch \L&. Das & kennen wir noch, es steht für den zu ersetzenden String der hier aber durch \L in Kleinbuchstaben umgewandelt wurde. Analog geht sed "s:[a-z]:\U&:g".

Man sieht, sed kann sehr viel. Und hier wurde erst ein Teil angerissen, man kann nach Zeilenanfängen suchen, nach Zeilenende, usw. Die gängigsten Probleme sollten aber mit den beschriebenen Befehlen abgedeckt sein. Wer übrigens den Doppelpunkt als Trennzeichen nicht mag, kann jedes beliebige Zeichen benutzen: sed "s;a;b;g". Man muss aber beachten, dass man dann dieses Zeichen nicht ohne weiteres suchen kann. Es muss dann mit dem Backslash escaped werden: sed "s;\;;:;g" benutzt das Semikolon als Trenner und ersetzt alle Semikolons durch Doppelpunkte... Das alles kann man aber auch außer Acht lassen und einfach beim Doppelpunkt als Trenner bleiben, denn der kommt in Dateinamen sowieso nie vor und bietet sich daher an.


3) Das wichtigste, der FOR-Befehl:
Bisher können wir zwar Dateinamen mit Hilfe von sed umbauen, aber umbenannt wird noch nichts. Dabei hilft uns der FOR-Befehl:
FOR /f "delims=" %i IN ('dir *.* /b') DO FOR /f %j IN ('echo %i^| sed "s: :_:g"') DO ren "%i" "%j"

Wichtig sind die fettgedruckten Teile. Hier muss man den Befehl an seine Bedürfnisse anpassen. Im vorderen Teil gibt man an welche Dateien umbenannt werden sollen, im Beispiel *.*, also alle im Verzeichnis. Möglich ist natürlich auch *.doc usw. Nur der /b Parameter muss unbedingt erhalten bleiben, damit dir nur den Dateinamen ausgibt. Im hinteren Teil gibt man den benötigten sed-Befehl ein. Im Beispiel werden alle Leerzeichen durch Unterstriche ersetzt.


4) Wer wissen möchte was genau der Befehl bewirkt:
Es sind zwei verschachtelte FOR-Schleifen. Die äußere durchläuft alle Dateinamen und speichert den aktuellen Namen in %i. Das "delims=" verhindert dass Dateinamen die Leerzeichen enthalten auseinandergeschnitten werden. Die innere Schleife nimmt das %i und leitet es per echo an sed weiter (das Pipe-Symbol | muss mit ^ escaped werden). Die Ausgabe von sed wird dann in %j gespeichert und mit ren "%i" "j" schließlich die Umbenennung durchgeführt. Eigentlich sind dazu natürlich nicht zwei Schleifen nötig, eine die alle Dateinamen abklappert würde reichen. Leider ist es nicht möglich einfach die Ausgabe eines Programmes in einer Variablen zu speichern. Sonst könnte man sich die zweite Schleife sparen und %j direkt belegen:

FOR ... DO echo %i| sed "s: :_:g" > %j & ren "%i" "%j" wäre eleganter, aber leider nicht machbar.


5) Umbenennen mit einer Batch-Datei
Soll der Befehl innerhalb einer Batch-Datei verwendet werden, müssen alle %i und %j durch %%i und %%j ersetzt werden. Es wird vorausgesetzt dass sich die sed.exe im Pfad befindet.

Hier eine Version bei der die umzubenennenden Datei per Drag & Drop auf die Batch-Datei gezogen werden können und dann nach dem zu verwendenden sed-Befehl gefragt wird:
@echo off 
set /p sed-command=Bitte sed-Befehl eingeben:  
 
:LOOP 
IF (%1)==() GOTO END 
 
FOR /f "delims=" %%i IN ('dir %1 /b') DO FOR /f %%j IN ('echo %%i^| %sed-command%') DO ren "%%i" "%%j" 
 
SHIFT 
GOTO LOOP 
 
:END 
set sed-command=

Oder leicht abgewandelt, man wird nach den umzubenennenden Dateien gefragt, die dann in der Form von *.txt oder Kuebelboeck*.mp3 eingegeben werden können:
@echo off 
set /p files=Welche Dateien sollen umbenannt werden:  
set /p sed-command=Bitte sed-Befehl eingeben:  
 
FOR /f "delims=" %i IN ('dir %files% /b') DO FOR /f %j IN ('echo %i^| %sed-command%') DO ren "%i" "%j" 
 
:END 
set files= 
set sed-command=

Ebenfalls möglich wäre es natürlich die Dateien und den sed-Befehl als Parameter für die Batch-Datei anzugeben.

6) Das wars soweit...
Das ganze ist natürlich nicht so intuitiv wie ein GUI-Tool zum Umbenennen, dafür kann es deutlich mehr und ist als Kommandozeilen-Befehl flexibler ohne dabei zu umständlich zu werden. Schließlich bleibt es im Kern bei einer einzelne Zeile. Ich hoffe die Kurzanleitung für sed ist halbwegs verständlich und deckt alle gängigen Fälle ab. Bei Problem gerne hier posten, dann können weitere Beispiele aufgenommen werden.

Je nach Art und Komplexität der Umbenennung sind Tools wie tr oder awk als Alternativen zu sed möglich. Solange das Programm Eingaben über Piping annimmt und nur das Resultat ohne weiteren Text ausgibt kann es ohne Änderungen in den Befehl eingefügt werden.
Mitglied: Skyemugen
19.01.2012 um 11:12 Uhr
Aloha,

schöne Anleitung, leider werden das die wenigsten 0-8-15-Anwender lesen bzw. kommen dann immer mit den Sätzen muss mit Bordmitteln gehen an und ignorieren selbstverständlich unsere Suchfunktion *fg* und wir haben trotzdem die Arbeit auf dem Tisch *gg*
Achja, die uncodierten Befehlszeilen kannst du auch hilfreich mit ALTGR+7 & ALTGR+0, geht auch in fett, darstellen face-wink

Hmm, das wichtigste: Der FOR-Befehl ... und wie man damit grundsätzlich umgeht face-wink sollte man dem Leser, der es nicht aus dem FF kann, schon mitgeben.

greetz André

P.S.: Habe mir das jetzt nicht im Detail durchgelesen, weil ich sed auch nicht extra dazu verwenden würde, auch wenn's seine Effizienz hat, aber wo bleibt dann der Spaß? ^__^
Bitte warten ..
Neuester Wissensbeitrag
RedHat, CentOS, Fedora
Tipp: Seit Fedora 20 und auch Redhat (bald auch Fedora Server 21 (freu)) den "firewalld" Daemon statt direkt "iptables" für seine Firewall nutzt, ist es nicht mehr so leicht ... von Frank, in RedHat, CentOS, Fedora
Diese Inhalte könnten dich auch interessieren
Batch & Shell
Frage: Guten Tag in die Runde der Fachleute. Ich habe folgendes Problem: In einem Unterordner liegen Dateien mit verschiedenen Dateinamen z.B. 12345678_0300_1_ra_123_yyy.txt, 12345678_0320_1_ra_123_yyy.txt, 12345678_0340_1_ra_123_yyy.txt usw. Alle Dateien mit dem ... von Hausboot, in Batch & Shell
Batch & Shell
Frage: Hallo Experten Ich habe eine stets wiederkehrende Arbeit am PC, die ich gerne mit einem Batch erledigen würde - nur fehlt mir leider das Wissen dazu, bzw. scheitere ... von Legolegolas, in Batch & Shell
Batch & Shell
Frage: Hallo zusammen, wie oben erwähnt, würde ich gerne innerhalb einer Ordnerstruktur (Dateien innerhalb aller Unterordner) in den Dateien nach einem vorgegeben String suchen und diesen durch einen Wert ... von yousaint, in Batch & Shell
Batch & Shell
Frage: Hallo zusammen, wie in der Beschreibung geschildert, würde ich gerne Dateien aus einem Ordner1 in alle Unterordner in einem Ordner2 kopieren. Gibt es eine Einfache Möglichkeit dafür? Vielen ... von yousaint, in Batch & Shell
Batch & Shell
Frage: Hallo zusammen, mal wieder habe ich ein großes Problem mit einer Batch. Die Batch um die es sich handelt hat den einzigen Auftrag, alle Dateien in einem Ordner ... von bilalui, in Batch & Shell
Heiß diskutierte Inhalte
Voice over IP
Frage: Hallo, Meine Firma möchte auf VoIP umsteigen, kenne mich mit TK Anlagen nicht wirklich aus. Was sind die Voraussetzungen für den Umstieg? Welche Hardware wird benötigt? Die Firma ... von 113235, in Voice over IP
Rechtliche Fragen
Frage: Sehr geehrte Damen und Herren, Wichtig zu wissen: ich bin noch in Ausbildung, mir fehlt noch einen Jahr, bis ich dan als Informatiker EFZ anerkannt werde. Ich habe ... von Lasky94, in Rechtliche Fragen
Debian
Frage: Hallo! Ich habe einen Dell Power Edge T110 II Auf diesem ist auf einem usb Stick das Dell Custom Image vom esxi 5.5 U2 installiert! Als Raid Controller ... von geforce28, in Debian
Cluster
Frage: Hallo liebe Leute!! ich bin neu hier im Forum und möchte zunächst einmal ein paar Worte zu meiner Person sagen. Ich administriere die große kleine Server Farm eines ... von SweetOne, in Cluster
DSL, VDSL
Frage: Mahlzeit allerseits, habe nun seit längerer Zeit einen Glasfaseranschluss mit 100.000 in beide Richtungen - alles schön und gut. Leider habe ich nun einen IPv6 Anschluss Zuhause und ... von Julian94, in DSL, VDSL