schnubbi8718
Goto Top

Dateien nach Ordner umbenennen

Tach, ich suche eine Möglichkeit Dateien in einem Ordner nach dem Ordnernamen umzubenennen. Und wenn weitere Dateien vorhanden sind, sollten die nach Gröse Sortiert (größtes zuerst) dann das nächst kleinere mit "-2" "-3" enden. Das alles in eine Schleife gepackt, damit ich das bei vielen Ordnern machen kann.

Zum verständnis nochmal:

ordner 1
---DateiX
---DateiY
Ordner 2
---DateiL
---Datei A
---Datei B


Wird zu
Ordner 1
---Ordner 1
---Ordner 1-2
Ordner 2
---Ordner 2
---Ordner 2-1
---Ordner 2-2

Hab hier schon mal ein Gerüst.
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do rename "%%i\%%j" "%%i%%~xj"  
)
Der Code benennt meine Dateinamen so um, dass sie heißen wie der Ordner, in dem sie sich befinden. Leider aber nur je eine Datei pro Endung. Jetzt kommt halt imme die Meldung dass die Datei schon vorhanden ist (wenn mehrere gleiche endungen vorhanden sind). Und da würde ich euch bitten mir weiter zu helfen.

Danke
Greez Schnubbi8718

Content-Key: 168485

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

Printed on: April 25, 2024 at 22:04 o'clock

Member: Friemler
Friemler Jun 22, 2011 at 12:38:09 (UTC)
Goto Top
Hallo Schnubbi,

könnte so gehen:
@echo off

setlocal


set "SrcDir=E:\test"  


for /f "delims=" %%d in ("%SrcDir%") do set "ParentDir=%%~nxd"  

for /f "delims=" %%f in ('dir /b /a:-d "%SrcDir%" 2^>NUL') do (  
  set "Item=%%~xf"  
  call :ConcatString Extensions
)

for %%e in (%Extensions%) do (
  set /a Cntr=1
  set "Ext=%%e"  

  for /f "delims=" %%f in ('dir /b /o:-s /a:-d "%SrcDir%\*%%e" 2^>NUL') do (  
    set "File=%SrcDir%\%%f"  
    call :RenameFile
    set /a Cntr+=1
  )
)

exit /b



:RenameFile
  ren "%File%" "%ParentDir%-%Cntr%%Ext%"  
exit /b



:ConcatString
  call set "Compare1=%%%1%%"  
  call set "Compare2=%%%1:%Item%=%%"  
  if "%Compare1%" neq "" if "%Compare1%" neq "%Compare2%" exit /b  
  call set "%1=%%%1%% %%Item%%"  
exit /b

In Zeile 9 wird der Name des Verzeichnisses ermittelt, das die umzubenennenden Dateien enthält.

In der FOR-Schleife in den Zeile 11 bis 14 werden alle vorkommenden Dateiendungen ermittelt. und in der Variablen Extensions durch Leerzeichen getrennt abgelegt. Das eigentliche Zusammensetzen der Variablen wird im Unterprogramm ConcatString erledigt, das den Namen der zusammenzusetzenden Variablen als Parameter erwartet.

Die einzelnen Erweiterungen werden von der FOR-Schleife in Zeile 16 abgearbeitet.

Die FOR-Schleife in Zeile 20 ermittelt alle Dateien mit der gerade aktuellen Erweiterung absteigend sortiert nach Größe und ruft das Unterprogramm RenameFile auf, wo die Umbenennung stattfindet.

Die erste Datei eines Typs erhält also schon den Zusatz -1. Ich hoffe das ist auch in Ordnung.

Wenn die Nummerierung unabhängig vom Dateityp sein soll, musst Du Dich nochmal melden.

Gruß
Friemler


[EDIT]
Script geändert:
Jeder Dateityp wird jetzt nur noch einmal in die Variable Extensions eingetragen. Dadurch werden überflüssige Umbenennungsversuche vermieden.
[/EDIT]
Member: Skyemugen
Skyemugen Jun 22, 2011 at 12:46:24 (UTC)
Goto Top
Aloha Schnubbi8718 und willkommen im Forum,

Zitat von @Friemler:
Wenn die Nummerierung Typunabhängig sein soll, musst Du Dich nochmal melden.

Was natürlich nicht bedeutet: „Wenn es passt, sehen wir eventuell einen grünen Haken aber dich nie wieder“ ... wie es leider so oft vorkommt ... was ist schon Feedback face-wink

greetz André
Member: Schnubbi8718
Schnubbi8718 Jun 22, 2011 at 13:05:55 (UTC)
Goto Top
Vielen Dank für die schnelle Antwort. Aber könntest du noch eine Kleinigkeit dran ändern?

Das bezieht sich jetz immer nur auf ein Verzeichnis. Mein Problem ist, dass ich etwa 900 Verzeichnisse habe. Da müsste ich jetzt für jedes verzeichnis die batch an der stelle set "SrcDir=E:\test" verändern, oder?
Gibts ne möglichkeit, dass ich auf dem nächsten übergeordneten Ordner die batch Datei lege, und die batch macht dann alle Ordner eine "Etage" tiefer durch?

Vielen Dank
Mitglied: 60730
60730 Jun 22, 2011 at 13:14:26 (UTC)
Goto Top
moin,

"eigentlich" schreiben wir doch, um anderen einen Tipp zu geben und nicht, weil wir deren Arbeit machen und weil wir ausschliesslich an den batchen die Änderungsrechte haben.

  • Im ernst - du willst das für dich und du mußt im Zweifel mal was ändern und dann ist keiner hier?

So geht das nicht...
Hast du dir die restlichen Beiträge vom Friemler mal angesehen?
AFAIK hat der eine Anleitung für die Schleifchen hier hingemalt....

Das bezieht sich jetz immer nur auf ein Verzeichnis. Mein Problem ist, dass ich etwa 900 Verzeichnisse habe.
Geht das irgendwie genauer?

  • Hast du eine Liste die abgearbeitet werden soll?
  • Sind das eh alle?
  • Gibt es eine Ausschlußliste, die nicht abgearbeitet werden soll?
Member: Friemler
Friemler Jun 22, 2011 at 13:19:43 (UTC)
Goto Top
Hallo Schnubbi,

Ok, ist nur eine kleine Erweiterung. Nimm das folgende Script. Wundere Dich aber nicht, wenn das bei der Datenmenge eine Weile dauert.
@echo off

setlocal


set "SrcDir=E:\test"  

for /d %%d in ("%SrcDir%\*.*") do (  
  set "ActDir=%%d"  
  call :ProcessDir
)

exit /b



:ProcessDir
  for /f "delims=" %%f in ("%ActDir%") do set "ParentDir=%%~nxf"  

  for /f "delims=" %%f in ('dir /b /a:-d "%ActDir%" 2^>NUL') do (  
    set "Item=%%~xf"  
    call :ConcatString Extensions
  )

  for %%e in (%Extensions%) do (
    set /a Cntr=1
    set "Ext=%%e"  

    for /f "delims=" %%f in ('dir /b /o:-s /a:-d "%ActDir%\*%%e" 2^>NUL') do (  
      set "File=%ActDir%\%%f"  
      call :RenameFile
      set /a Cntr+=1
    )
  )
exit /b



:RenameFile
  ren "%File%" "%ParentDir%-%Cntr%%Ext%"  
exit /b



:ConcatString
  call set "Compare1=%%%1%%"  
  call set "Compare2=%%%1:%Item%=%%"  
  if "%Compare1%" neq "" if "%Compare1%" neq "%Compare2%" exit /b  
  call set "%1=%%%1%% %%Item%%"  
exit /b

Gruß
Friemler
Member: Schnubbi8718
Schnubbi8718 Jun 22, 2011 at 13:35:59 (UTC)
Goto Top
Vielen Herzlichen Dank Friemler, du bist echt ein Ass.

Ich bin ein Enduser, der sich ab und an mit komplizierteren Dingen beschäftigt, also werde ich jetzt nicht jeden Tag hier sein und das Forum durchlesen. Seid mir nicht böse deswegen, aber es ist nun mal so. Ihr seid von einem anderen Board empfohlen worden, (euer Ruf ist nicht schlecht) deswegen und durch google bin ich auf euch gekommen.

Ich hab etwas erfahrung mit Delphi (Pascal), hab früher mit BASIC ein bisschen programmiert und aktuell hab ich vor mir Java beizubringen (über einen Bekannten, der das im Studium lernt). Wenn ihr also Fragen dazu habt, kann ich gerne versuchen da etwas beizusteuern.

Nur mal so als Info, nicht dass ihr glaubt ich hab eure Dienste nur ausgenutzt oder, ich weiß nicht genau worauf TimoBeil da genau raus wollte.

Vielen Dank und auf bald
Member: Skyemugen
Skyemugen Jun 22, 2011 at 13:54:28 (UTC)
Goto Top
Aloha,

ah der T-Mo hat einfach gesagt, die Nase dick, dass oftmals nur Leute kommen, ein Skript wollen und wieder gehen und er eigentlich der (durchaus berechtigten) Meinung ist, man sollte hier den Usern nur helfen und nicht deren Arbeit abnehmen .. allerdings ist das immer relativ *gg* ob man gerade Lust hat, ein ganzes Skript zu entwerfen oder nicht (zumindest geht mir das so). Der T-Mo fragt also erst einmal, wie die ganze Dimension aussieht (mache ich auch oft), um dann mit dem Satellitenüberblick einzelne Vorstöße zu geben *lach*. allerdings verstehen viele (vor allem Eintages-)Enduser den T-Mo nicht und halten seine konstruktiven Beiträge für Bitte das Wort deiner Wahl einfügen ... der arme

greetz André

P.S.: Hm, gut, wir wurden von einem anderen Board empfohlen - sehr schön ^_^