thorsten90
Goto Top

Dateinamen ändern

Hallo

Ich habe eine Batch-Datei um Unterordner in einzelne rar-Archive zu packen:

for /d %%i in ("%dir%\*") do (  
    for /d %%j in ("%%i") do ren "%%j\*.cbr" *.rar >NUL 2>&1  
    for /d %%j in ("%%i\*") do rar a -r -o- -ep1 -inul "%%~dpj%%~nxi_-_%%~nxj.rar" "%%j"  
    for /d %%j in ("%%i") do ren "%%j\*.rar" *.cbr >NUL 2>&1  
    echo %%i verarbeitet
)

Der Name der rar ist dabei immer Ordner-Unterordner.rar.
Die Unterordner haben verschiedene Namen. Einige sind einfach nur (teils dezimale) Zahlen, andere enthalten Text, entweder in der Form text_zahl oder buchschabeZahl (direkt hintereinander, ohne Leerzeichen oder Unterstrich).

Um dies Archive weiter zu verarbeiten muss der Dateiname mit über einen Regulären Ausdruck verarbeitet werden. Allerdings funktioniert dies nicht, da die Zahl am Ende des Namens nicht richtig abgetrennt ist.

Kann man die Batch so anpassen, dass die Zahl (unschiedlich viele Ziffern, manche dezimal mit . ) durch einen zusätzlichen Bindestrich abgetrennt wird?

Grüße

ps: Der Name muss angeasst werden, bevor die rar-Datei erstellt wird, da die Batch später zum aktuallisieren erneut verwendet werden soll und die Archive sonst doppeerstellt werden würden.

Content-Key: 212054

Url: https://administrator.de/contentid/212054

Printed on: April 24, 2024 at 16:04 o'clock

Member: Endoro
Endoro Jul 21, 2013 updated at 13:35:16 (UTC)
Goto Top
Hallo Thorsten,
etwas mehr Erklärung wär klasse. Ich seh' keine Zahlen (mag an der Hitze liegenface-smile)
lg
Member: Thorsten90
Thorsten90 Jul 21, 2013 updated at 13:59:50 (UTC)
Goto Top
Hi

Mein Verzeichnis sieht so aus


Hauptverzeichnis
    1. Ordner_1
        1. Unterordner_1
        2. Unterordner_2
        3. Unterordner_3
        4. Ordner_1-Unterordner_1.rar
        5. Ordner_1-Unterordner_2.rar
        6. Ordner_1-Unterordner_3.rar
    2. Ordner_2
        1. Unterordner1
        2. Unterordner2
        3. Unterordner3
        4. Ordner_2-Unterordner1.rar
        5. Ordner_2-Unterordner2.rar
        6. Ordner 2-Unterordner3.rar
    3. Ornder_3
        1. Unterordner_1
        2. Unterordner_2
        3. Unterordner_3
        4. Ordner_3-Unterordner_1.rar
        5. Ordner_3-Unterordner_2.rar
        6. Ordner_3-Unterordner_3.rar


Dabei sind die Namen der Ordner und Unterordner verschieden lang, enthalten teilweise Unterstriche und auch Zahlen. Aber der Name der Unterordner endet immer mit ein Zahl. Diese Zahl ist teilweise dezimal, also sowas wie ...3.4 .ext . Auch die länge ist unterschiedlich, mal sind die Zahlen einstellig, mal zoder dreistellig, etc. Und wie im Ordner_2 gezeigt ist die Zahl auch nicht immer mit einem Unterstrich abgetrennt.

Und was ich gerne hätte ist vor dieser Zahl einen Bindestrich, der sie vom Rest trennt, damit ich den Dateinamen verarbeiten kann. Momentan erkennt der reguläre Ausdruck die Länge der Zahl nicht richtig und nimmt einige Ziffern zum davorstehenden Namen.
Member: Endoro
Endoro Jul 21, 2013 at 15:43:26 (UTC)
Goto Top
Zitat von @Thorsten90:
Momentan erkennt der reguläre Ausdruck die Länge der Zahl nicht richtig und nimmt einige Ziffern zum
davorstehenden Namen.

Das ist ein merkwürdiger regulärer Ausdruck.
Also mit Regex ist die Trennung einer Zeichenkette an der Grenze Buchstabe/Ziffer eigentlich einfacher als mit Batch.
Könnte man dort ansetzen und den Regex-Ausdruck verbessern?

lg
Member: Thorsten90
Thorsten90 Jul 21, 2013 at 20:55:14 (UTC)
Goto Top
Das war auch mein erster Gedanke. Die Dateien um die es geht, sind Comic-Archive. Die sollen dann mit dem Programm Calibre verwaltet werden. Das ist ein Programm um ebooks zu verwalten.

Der Ausdruck sieht so aus:

(?P<series>[^_]*)-(?P<title>[^_.]*)(?P<series_index>\d+.*)


Ich habe den Ausdruck ihn in vier Foren, die sich speziell mit Calibre beschäftigen, gepostet, da ich selber im Internet nichts gefunden habe, das hilft. Ohne die Trennung erkennt der Ausdruck nur zwei Ziffern und betrachtet den Rest als Teil des Titels. In den ver Foren habe ich bisher nur eie Antwort bekommen, die nicht funktioniert hat, daherdachte ich mir, ich versuche es mal über die Batch.
Member: Endoro
Endoro Jul 21, 2013 updated at 22:49:14 (UTC)
Goto Top
Die Calibre-Regex konnte ich nicht testen.
Deshalb ein Vorschlag mit sed:

>for /f "delims=" %a in ('dir /b/a-d/s *.rar') do @echo %~fa|sed -r "s/.*\\([^\]*[[:alpha:]_ -]+\.*)([0-9][0-9.]*.rar)$/echo ren \"^&\" \"\1-\2\"/e"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_1\Ordner_1-Unterordner 10.1.rar" "Ordner_1-Unterordner -10.1.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_1\Ordner_1-Unterordner.10.1.rar" "Ordner_1-Unterordner.-10.1.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_1\Ordner_1-Unterordner1.1.rar" "Ordner_1-Unterordner-1.1.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_1\Ordner_1-Unterordner10.1.rar" "Ordner_1-Unterordner-10.1.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_1\Ordner_1-Unterordner_1.rar" "Ordner_1-Unterordner_-1.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_1\Ordner_1-Unterordner_10.1.rar" "Ordner_1-Unterordner_-10.1.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_2\Ordner_1-Unterordner_2.rar" "Ordner_1-Unterordner_-2.rar"
ren "C:\Hauptverzeichnis\Ordner_1\Unterordner_3\Ordner_1-Unterordner_3.rar" "Ordner_1-Unterordner_-3.rar"
ren "C:\Hauptverzeichnis\Ordner_2\Unterordner1\Ordner_3-Unterordner1.rar" "Ordner_3-Unterordner-1.rar"
ren "C:\Hauptverzeichnis\Ordner_2\Unterordner2\Ordner_2-Unterordner2.rar" "Ordner_2-Unterordner-2.rar"
ren "C:\Hauptverzeichnis\Ordner_2\Unterordner3\Ordner_2-Unterordner3.rar" "Ordner_2-Unterordner-3.rar"
ren "C:\Hauptverzeichnis\Ordner_3\Unterordner_1\Ordner_3-Unterordner_1.rar" "Ordner_3-Unterordner_-1.rar"
ren "C:\Hauptverzeichnis\Ordner_3\Unterordner_2\Ordner_3-Unterordner_2.rar" "Ordner_3-Unterordner_-2.rar"
ren "C:\Hauptverzeichnis\Ordner_3\Unterordner_3\Ordner_3-Unterordner_3.rar" "Ordner_3-Unterordner_-3.rar"
Je vielgestaltiger der Input desto komplizierter die Regex, um alles zu erfassen.
Bei all diesen Beispielen ist jedenfalls ein - vor der Zahl.

lg
Member: Thorsten90
Thorsten90 Jul 22, 2013 updated at 00:56:09 (UTC)
Goto Top
Danke, aber um alle Verichnisse auszulisten sind es zu viele, dass, was ich angegeben habe, war nur das Muster.

Habe ne weile gesucht, aber ich denke, ich habe einen Lösungsansatz mittels stringmanipulation gefunden. Habe das Ganze etwas angepast, damit es für mein Problem passt. Zum testen habe ich diesen Code benutzt:

@echo off
setlocal enabledelayedexpansion
set string=1123_bafgafg_fasdgasdg_1231_asdgag_asgasdfg_1311_c111.1.rar
set "findn=*_"  
set "findc=*c"  
for /l %%n in (1, 1, 15) do call set string=%%string:!findn!=%%
call set string=%%string:!findc!=%%
echo %string%
pause

Habe einfach irgenwas als string eingegeben, aber damit sollte alles abgedeckt sein. Er liefert, wie gewolt, nurnoch die Zahl am Ende.

Hab dann versucht, das ganze schrittweise in mein meinen Code zu integrieren. Der gedanke war, den Verzeichnisnamen in einer Variable zu speichern und anschließend die Variable zu verändern und zu übergeben, anstatt den Verzeichnisnamen direkt zu bergeben. Dazu wollte ich ersmal das übergeben an eine Variable testen:

@echo off
setlocal enabledelayedexpansion
set dir= xyz
for /d %%i in ("%dir%\*") do (  
    for /d %%j in ("%%i\*") do (  
    set var=%%~nxj
    @echo %var%
    )
    echo %%i verarbeitet
)
echo Fertig
pause

Aber ich bekomme nur "ECHO ist ausgschaltet" als Ausgbe, und solange ich nicht die korrekte Ausgabe habe, kann ich die manipulation nicht testen. Wo liegt mein Fehler?
Member: bastla
bastla Jul 22, 2013 at 05:38:10 (UTC)
Goto Top
Hallo Thorsten90!

"delayedExpansion" nicht nur aktivieren, sondern auch verwenden:
echo !var!
Grüße
bastla
Member: Thorsten90
Thorsten90 Jul 22, 2013 at 06:43:31 (UTC)
Goto Top
Hi

Vielen Dank, dass du mir wieder geholfen hast. Habe meine Batch damit angepasst und sie macht jetzt genau das, was sie soll. Mit den Dateinamen kann ich jetzt gut arbeiten.

Grüße