dctibi
Goto Top

Dateinamen ergänze, Pfad verkürzen

Hallo, bräuchte unter DOS ein Skript (unter Unix wäre es ja keine Kunst), das bei uns den Verzeichnisbaum aufräumt:

Weit verschachtelter Verzeichnisbaum.
Da und dort sind Dateinamen, deren Name unter 4 Zeichen lang ist.
Das muss nicht sein und sollte behoben werden. Nur wie?
<p>
z.B. d:\daten\bla\bla2\bla3\fotos\sommer2008\10.jpg
sollte werden zu d:\daten\bla\bla2\bla3\fotos\sommer2008_10.jpg
<p>
(Und danach kann sommer2008 als Ordner aufgelöst werden)
<p>
Frage: Wie geht das unter MS-DOS/Windows?!?!?!

Content-Key: 152238

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

Printed on: April 19, 2024 at 13:04 o'clock

Member: bastla
bastla Oct 02, 2010 at 18:17:55 (UTC)
Goto Top
Hallo dctibi und willkommen im Forum!

Grundsätzlich ließe sich Teil 1 (das Ergänzen des Dateinamens) schematisch etwa so umsetzen:
@echo off & setlocal
set "Basis=D:\Test"  

for /f %%i in ('dir /s /b /a-d "%Basis%"') do set "Name=%%~ni" & call :ProcessFile "%%~fi"  
goto :eof

:ProcessFile
if "%Name:~3%" neq "" goto :eof  
for %%a in ("%~1\..") do set "Parent=%%~nxa"  
echo move %1 "..\%Parent%_%~nx1"  
goto :eof
Das "echo" vor dem "move" sorgt dafür, dass das Umbenennen und Verschieben zunächst nur (durch die Ausgabe des entsprechenden Befehles) simuliert wird. Nicht berücksichtigt (auch in Deiner Beschreibung) ist vorläufig die Möglichkeit, dass es eine Kollision der umbenannten Datei mit einer im darüber liegenden Ordner bereits vorhandenen gleichnamigen Datei geben könnte ("move" würde in diesem Fall ohne Rückfrage überschreiben) ...

Teil 2 (Auflösen des Ordners) könnte aber eigentlich nur (und auch dann sinnvoller Weise erst im Nachhinein) für gänzlich leere (zumindest hinsichtlich darin bzw in Unterordnern enthaltener Dateien) Ordner durchgeführt werden - also etwa:
@echo off & setlocal
set "Basis=D:\Test"  

for /r "%Basis%" %%i in (.) do (  
    set "Leer=True"  
    for /f %%a in ('dir /s /b /a-d "%%i" 2^>nul') do set "Leer="  
    if defined Leer echo rd /s /q "%%i"  
)
Auch hier dient das "echo" in Zeile 7 dem gefahrlosen Testen ...

Grüße
bastla
Member: dctibi
dctibi Oct 04, 2010 at 13:27:27 (UTC)
Goto Top
Hallo Bastla!

Ist ja genial gebastelt! wow!

Jedoch habe ich Probleme mit dem move...
Dein Skript startet in %Basis%
Holt dann eine Datei %1 und schiebt sie in Zeile 10 vom AKTUELLEN Pfad (also meinem Working-Directory) nach .. und dort mit dem von mir so gewünschten Dateinamen.
Das .. sollte sich jedoch nicht auf den aktuellen Pfad, sondern auf den Pfad zu %1 beziehen.

Dass bestehende Dateien nicht überschrieben werden, sollte man mit echo n|move lösen können, oder?

Beim zweiten Teil überprüft er wohl nur, ob keine Dateien drinnen sind - aber nicht, ob es Unterordner gibt - sehe ich das richtig?

Aber Danke für diese ersten, genialen, weil doch so kurz und einfach ausschauend (hätte es trotzdem nicht geschafft *g*) Antworten!
Member: bastla
bastla Oct 04, 2010 at 14:09:00 (UTC)
Goto Top
Hallo dctibi!
Das .. sollte sich jedoch nicht auf den aktuellen Pfad, sondern auf den Pfad zu %1 beziehen.
Stimmt (in der Zeile davor hatte ich's auch noch dabei), daher:
echo move %1 "%~1\..\%Parent%_%~nx1"
Dass bestehende Dateien nicht überschrieben werden, sollte man mit echo n|move lösen können, oder?
Nein - in einem Batch überschreibt "move" ohne Rückfrage, daher hilft nur nur ein "if exist" vorweg:
if not exist "%~1\..\%Parent%_%~nx1" (  
    echo move %1 "%~1\..\%Parent%_%~nx1"  
) else (
    echo %1 konnte nicht verschoben werden!
)
Beim zweiten Teil überprüft er wohl nur, ob keine Dateien drinnen sind - aber nicht, ob es Unterordner gibt - sehe ich das richtig?
Jein - auch Unterordner werden auf enthaltene Dateien überprüft, sodass also nur gelöscht wird, wenn nur noch Unterordner vorhanden sind (oder eben der Ordner ganz leer ist).

Grüße
bastla
Member: dctibi
dctibi Oct 06, 2010 at 11:43:16 (UTC)
Goto Top
Hallo Bastla,

habe bei mir dann Punkt 1 ausgebessert;
und Punkt 2 habe ich getestet... JAAA, es funktioniert! Super! Danke!