darkprodukt
Goto Top

Batch Datein aus Unterordnern in einen Hauptordner verschieben und Durchnummerieren

Guten Abend,

Ich habe mal wieder en kleines Problem...

Ich habe einen Hauptordner in dem sich eine sehr große Ordnerstrucktur befindet.
Auserdem noch so ca 30.000-150.000 Datein.

Um das unwichtige schonmal zu beseitigen, werde ich alle Datein <50kb Löschen.
Batch - Dateien unter bestimmter Größe löschen

Nun möchte ich alle übrig geblieben Datein in einen Ordner verschieben (also ohne ordnerstruktur)
und diese Durchnummerieren das sie so aussehen.

000001
000002
...

Wie ich diese Nummerierung mache wenn schon alle Datein in einem ordner sind, weiß ich.

Das Problem ist, dass es manche Dateinamen schon gibt. Also müssten sie schon beim verschieben umbenant werden.

Mir schwirren schon so einige Lösungsansätze vor, aber mal schaun was ihr noch so drauf habt.

Ich setz mich mal dran mal gespannt obs ich sogar noch selbst hinbekomme.

Grüße
Darkprodukt

Edit1:
Ich denke das müste so in etwa aussehen, aber leider Beendet sich das ding ohne einen mucks...


Natürlich muss das @echo in der 1. for-schleife gelöscht und das @echo in der 2. zu move geändert werden.
@echo off & setlocal

set /a count=1000001
set /p "Ordner=Ordner: "  
set /p "Ziel=Ziel: "  

for /f %%i in ('dir /a-s-h-d /b /s "%Ordner%"') do @if %%~zi lss 40000 @echo del "%%i"  

for /f %%i in ('dir /a-s-h-d /b /s "%Ordner%') do set "datei=%%i" ^  
												  &setlocal enabledelayedexpansion ^
												  &@echo "!datei!" "!Ziel!!count:~-6!%%~xj" ^  
												  &set /a count=count+1 ^
												  &endlocal

echo Abgeschlossen
pause

Content-ID: 189248

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

Ausgedruckt am: 08.11.2024 um 02:11 Uhr

Biber
Biber 08.08.2012 um 05:35:00 Uhr
Goto Top
Moin Darkprodukt,

ohne auf die Sinnhaftigkeit des Plans einzugehen wäre dein Ansatz ungefähr so lauffähig:
@echo off & setlocal enabledelayedexpansion

set /a count=1000001
set /p "Ordner=Ordner: "  
set /p "Ziel=Ziel: "  

for /f %%i in ('dir /a-s-h-d /b /s "%Ordner%"') do @if %%~zi lss 40000 @echo del "%%i"  

for /f %%i in ('dir /a-s-h-d /b /s "%Ordner%"') do (  
		echo move "%%i" "%Ziel%\!count:~-6!%%~xi"  
		set /a count+=1 
  )
echo Abgeschlossen
pause

P.S. Zwei der goldenen Regeln sowohl beim Sich-Ausprobieren in Batch wie auch im Kamasutra:
  • Kompliziert wird es von allein.
  • Kunstvolle Verrenkungen haben nicht immer etwas Graziles an sich.

Grüße
Biber
bastla
bastla 08.08.2012 um 07:04:27 Uhr
Goto Top
Hallo Biber!

Dass "delayedexpansion" sich auch bei den Laufvariablen von "for"-Schleifen auswirkt, hatte ich auch lange nicht beachtet - daher vielleicht doch:
@echo off & setlocal

set /a count=1000001
set /p "Ordner=Ordner: "  
set /p "Ziel=Ziel: "  

if "%Ziel:~-1%"=="\" set "Ziel=%Ziel:~,-1%"  
for /f "delims=" %%i in ('dir /a-s-h-d /b /s "%Ordner%"') do @if %%~zi lss 40000 @echo del "%%i"  

for /f "delims=" %%i in ('dir /a-s-h-d /b /s "%Ordner%"') do (  
    set "Datei=%%i"  
    setlocal enabledelayedexpansion
    echo move "!Datei!" "%Ziel%\!count:~-6!%%~xi"  
    endlocal
    set /a count+=1
  )
echo Abgeschlossen
pause
Grüße
bastla
Biber
Biber 08.08.2012 aktualisiert um 07:49:52 Uhr
Goto Top
Moin bastla,

ist mir zwar abstrakt einsichtig, aber bei welchem Inhalt der Variablen %Datei% könnte denn ein Unterschied auftreten zwischen dem aufgelösten
echo move "!Datei!" "%Ziel%\!count:~-6!%%~xi" versus echo move "%%i" "%Ziel%\!count:~-6!%%~xi" ??

Oder an welcher Stelle wird durch das setlocal enabledelayedexpansion innerhalb der FOR-Anweisung ein Problem vermieden?

Grüße
Biber
bastla
bastla 08.08.2012 aktualisiert um 10:17:14 Uhr
Goto Top
Hallo Biber!

Mit einer zusätzlichen Zeile
    echo move "%%i" "%Ziel%\!count:~-6!%%~xi"
und den folgenden Dateien:
D:\>dir "Dieser! Ordner"
 Datenträger in Laufwerk D: ist Volume
 Volumeseriennummer: 1234-5678

 Verzeichnis von D:\Dieser! Ordner

08.08.2012  09:54    <DIR>          .
08.08.2012  09:54    <DIR>          ..
08.08.2012  09:55                 2 Zwei ! im Namen.txt
08.08.2012  09:55                 2 Wirklich zwei !! im Namen.txt
               2 Datei(en)              4 Bytes
               2 Verzeichnis(se), 69.363.770.624 Bytes frei
sieht das etwa so aus:
D:\>NummeriertZusammenfassen.cmd
Ordner: Dieser! Ordner
Ziel: X:\
del "D:\Dieser! Ordner\Zwei ! im Namen.txt"
del "D:\Dieser! Ordner\Wirklich zwei !! im Namen.txt"
move "D:\Dieser! Ordner\Zwei ! im Namen.txt" "X:\000001.txt"
move "D:\Dieser im Namen.txt" "X:\000001.txt"
move "D:\Dieser! Ordner\Wirklich zwei !! im Namen.txt" "X:\000002.txt"
move "D:\Dieser\000002.txt"
Abgeschlossen
Drücken Sie eine beliebige Taste . . .
Grüße
bastla
Biber
Biber 08.08.2012 um 10:42:44 Uhr
Goto Top
Moin bastla,

okay, okay.... ja, es könnte vorkommen.

In "Per Anhalter durch die Galaxis" wird so etwas als Antrieb für Raumschiffe benutzt.

Wahrscheinlich wird der Batchschnipsel dennoch abrauchen, weil plötzlich ein fliederfarbener Meteorit die USV des Unternehmens durchschlägt... face-wink

Danke und Grüße
Biber
Darkprodukt
Darkprodukt 08.08.2012 um 14:16:05 Uhr
Goto Top
Ich danke euch beiden...

Ich konnte jezt die Datein von 45.000 auf 1.200 verringern und kan so
erhebliche laufzeiten meines Analyse Programms sparen.

Die kleinen Datein waren deshalb unwichtig, da sie eigentlich
den inhalt der großen hatten blos auf viele kleine verteilt.

Grüße
Darkprodukt