Umbenennen der Dateiendung bei vielen Dateien

BallerNacken

Ensign
Registriert
März 2008
Beiträge
227
Hi Leute,

ich habe sehr viele pdf Dokumente (etwa 1600). Dabei sind allerdings einige, bei denen sich die Endung auf ominöse Weise selbst gekillt hat. Mag bei Kopiervorgängen oder ähnlichem passiert sein. Wie dem auch sei...

Ich habe einen Ordner mit etwa 30 Unterordnern, in denen einzelne pdf's liegen. Und in dem Hauptordner sind liegen auch noch so einzelne pdf's.

Nun habe ich das ein oder andere Programm ausporbiert. Allerdings hat mir keines bisher so richtig zugesagt. Habe dann einfach: rename *. *.pdf gemacht.
Das hat auch mit den einzelnen Dateien im Huaptordner super geklappt. Allerdings klappt es nciht mit den Unterordnern. Soll heißen, ich müsste im cmd in jeden einzelnen Ordner navigieren und dort dir Kommandozeile einhacke. --> ergo, kein bock drauf!

Kann ich mittels der Kommandozeile irgendwie die kompletten Unterordner in einem Kommando mit einbeziehen? Das wäre optimal. Oder eine Progammempfehlung, mit der dieser Schritt gut funktioniert.

MfG BallerNacken
 
Kommandozeile? Guter Mann! ;)

Schau dir mal den "for" Befehl an, der kann sowas ("for /?" für den Hilfetext).

Beispiel:
for /R %a in (*.) do ren "%a" "%a.pdf"

Die Anführungszeichen um die beiden Parameter für ren(ame) sind wichtig, falls Leerzeichen im aktuellen Dateinamen enthalten sind.
 
Du kannst in der Windows Command Shell den rename Befehl auch rekursiv einsetzen. Das beherrscht dieser zwar nicht von Haus aus, mit einer einzigen gescripteten Zeile ist das Problem aber bereits gelöst. Mit dem folgenden Befehl (direkt in der Shell eingegeben), werden die in allen Unterverzeichnissen gefundenen Dateien umbenannt:

for /r %x in (*.) do ren "%x" *.pdf

edith: zu spät ;)
 
Wow nice!

Danke Leute! Warum umständlich programmierte Programme, wenn es so extrem einfach geht!
Da es mich durchaus interessiert und ich gerne neues lerne, könntet ihr mir die Zeile dann nochmal Stück für Stück erklären?
Verstehe sie nicht komplett. :)

edit: Es waren auch ein paar .doc in den Ordnern enthalten (hätte ich erwähnen sollen). Diese scheinen jetzt auch umbeannt worden zu sein. Kann ich das irgendwie verhindern?
 
Zuletzt bearbeitet:
Der Befehl besteht aus zwei Teilen:

Zuerst wird eine Suchmaske (*.) rekursiv /r angewendet, welche als Ergebnis alle passenden Dateien aus dem aktuellen Verzeichnis (und allen vorhandenen Unterverzeichnissen) zurückgibt.

Auf jedes Ergebnis der Suche wird der Umbenennungs-Befehl ren (oder auch rename) gewirkt. Dieser hat die Syntax (ren alt neu), welche hier natürlich verwendet wird. Der aktuelle Dateiname steckt in der Variable %x und wie SMO! schon sagte, sind die Anführungszeichen wichtig (die Datei beziehungsweise der Pfad könnte ja Leerzeichen enthalten). Das *.pdf bedeutet, dass der Dateiname beibehalten werden kann, die Endung aber in .pdf geändert werden soll.

edith: eigentlich sollten andere Dateien davon nicht beeinflusst werden. Die Suchmaske findet wirklich nur Dateien ohne echte Endung (ob da ein Punkt am Ende ist oder nicht, bleibt egal).
 
Zuletzt bearbeitet:
Kein Problem. Mit "for /?" gibt es wie bereits gesagt eine relativ ausführliche Hilfe. Spiele einfach mal ein bisschen mit dem Befehl und "echo" herum:

for %a in (*.pdf) do echo %a

Dieser Befehl würde für alle Dateien im aktuellen Verzeichnis, die dem Schema "*.pdf" entsprechen (also .pdf als Dateiendung haben), einfach den Dateinamen ausgeben (echo schreibt Text).
%a ist dabei der Name der Variable, die den jeweiligen Dateinamen enthalten wird. Den Variablennamen kann man selbst wählen, er darf aber nur einen Buchstaben lang sein.

Wenn man die Ausgabe genau anschaut, wird man sehen, dass nicht nur die Dateinamen angezeigt werden (die Ausgabe des echo Befehls), sondern davor immer noch der jeweilige Befehl selbst. Hat das aktuelle Verzeichnis z.B. die pdf-Dateien foo.pdf und bar.pdf würde das so aussehen:

for %a in (*.pdf) do echo %a
> echo bar.pdf
bar.pdf
> echo foo.pdf
foo.pdf

Möchte man die Anzeige der Befehle unterdrücken, damit man nur die Ausgabe sieht, kann man "@" als Präfix benutzen:

for %a in (*.pdf) do @echo %a
bar.pdf
foo.pdf


Es gibt auch diverse Modifikatoren für die Dateinamen. Möchte man z.B. das Gegenteil deiner Aufgabe tun, also die Dateiendung ".pdf" entfernen bei allen pdf Dateien eines Verzeichnises und seiner Unterverzeichnisse, dann könnte man das so tun:

for /R %x in (*.pdf) do @ren "%x" "%~dx%~px%~nx"

for /R: rekursiver for Befehl
%x: Variablendefinition
(*.pdf): Dateimaske

ren "%x" "%~dx%~px%~nx": der Befehl, der für jede gefundene Datei ausgeführt wird.
%x enthält den aktuellen Dateinamen, in diesem Fall ein kompletter, absoluter Name wie z.B. "C:\bla\test.pdf"
%~dx gibt nur das Laufwerk zurück ("C:")
%~px gibt nur den Pfad zurück ("\bla\")
%~nx gibt nur den Namen ohne Endung zurück ("test")

(Kann auch einfacher kombiniert werden zu "%~dpnx")
Für mehr, siehe for /? ;)
 
Zuletzt bearbeitet:
Zurück
Oben