Per Batch bestimmte anzahl von dateien verschieben und ordner anlegen
Hi,
folgende Ausgangsituation,
über den Tag verteilt landen in einem bestimmten Ordner der User Dateien mit unterschiedlichen Dateinnamen und Endungen
Struktur
user1\project1\results
user1\project2\results
user1\daten1\results
user2\test123\results
user2\wasweisich\results
user3 ....
user3 .....
in diesen results Ordnern landen manchmal bis zu 15000 dateien, welchen über ftp auf unseren Webspace hochgeladen werden.
gibt es eine möglichkeit innerhalb der Ordner project1 oder project2 unterordner anzulegen wo maximale 400 oder 500 dateien drin sind
user1\project1\results
user1\project1\results1-400
user1\project1\results400-500
user1\project2\results
user1\project2\results1-400
user1\daten1\results
user1\daten1\results1-400
user1\daten1\results400-500
user1\daten1\results500-1000
user2\test123\results
user2\wasweisich\results
user3 ....
user3 .....
es geht halt darum das resultsverzeichniss mit den massig dateien auf mehrere kleinere zu verteilen. geht sowas überhaupt ?
lg thunderbolt
folgende Ausgangsituation,
über den Tag verteilt landen in einem bestimmten Ordner der User Dateien mit unterschiedlichen Dateinnamen und Endungen
Struktur
user1\project1\results
user1\project2\results
user1\daten1\results
user2\test123\results
user2\wasweisich\results
user3 ....
user3 .....
in diesen results Ordnern landen manchmal bis zu 15000 dateien, welchen über ftp auf unseren Webspace hochgeladen werden.
gibt es eine möglichkeit innerhalb der Ordner project1 oder project2 unterordner anzulegen wo maximale 400 oder 500 dateien drin sind
user1\project1\results
user1\project1\results1-400
user1\project1\results400-500
user1\project2\results
user1\project2\results1-400
user1\daten1\results
user1\daten1\results1-400
user1\daten1\results400-500
user1\daten1\results500-1000
user2\test123\results
user2\wasweisich\results
user3 ....
user3 .....
es geht halt darum das resultsverzeichniss mit den massig dateien auf mehrere kleinere zu verteilen. geht sowas überhaupt ?
lg thunderbolt
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 202585
Url: https://administrator.de/forum/per-batch-bestimmte-anzahl-von-dateien-verschieben-und-ordner-anlegen-202585.html
Ausgedruckt am: 15.05.2025 um 22:05 Uhr
27 Kommentare
Neuester Kommentar
Hallo thunderbolt78 und willkommen im Forum!
Das könnte etwa so gehen:
Soll der Basisordner (unter dem die einzelnen "user#"-Ordner liegen) in Zeile 2 ein Root-Verzeichnis (wie etwa "D:\") sein, muss er ohne abschließenden "\" angegeben werden - also:
Wegen des "
Um sich das Ergebnis der Simulation in Ruhe ansehen zu können, den Batch (gespeichert zB als "D:\Aufteilen.cmd") aus einem CMD-Fenster starten und die Ausgaben in eine Datei schreiben lassen - im Beispiel etwa:
Wenn die Dateien tatsächlich verschoben werden, bleiben die ursprünglichen "results"-Ordner erhalten, sollten allerdings jeweils leer sein.
Grüße
bastla
Das könnte etwa so gehen:
@echo off & setlocal
set "Basis=D:\Testordner"
set "Ordner=results"
set "Anzahl=400"
for /f "delims=" %%i in ('dir /s/b/ad "%Basis%\%Ordner%"') do call :ProcessDir "%%i"
goto :eof
:ProcessDir
echo Bearbeite %1
pushd %1
set /a Nr=0
set /a Bis=0
set /a Z=0
for /f "delims=" %%a in ('dir /b/a-d 2^>nul') do call :ProcessFile "%%a"
popd
echo #################################
goto :eof
:ProcessFile
set /a Z+=1
if %Z% leq %Bis% goto :MoveIt
set /a Nr+=1
set /a Von=(Nr-1)*Anzahl+1
set /a Bis=Nr*Anzahl
set /a Z=Von
set Verz=..\%Ordner%%Von%-%Bis%
echo md %Verz%
:MoveIt
echo move %1 %Verz%
goto :eof
set "Basis=D:"
echo
" am Beginn der Zeilen 29 und 31 wird der gesamte Ablauf nur simuliert - wenn das Ergebnis vernünftig aussieht, einfach beide entfernen und machen lassen ...Um sich das Ergebnis der Simulation in Ruhe ansehen zu können, den Batch (gespeichert zB als "D:\Aufteilen.cmd") aus einem CMD-Fenster starten und die Ausgaben in eine Datei schreiben lassen - im Beispiel etwa:
D:\Aufteilen.cmd>D:\Ergebnis.txt
Grüße
bastla
Hallo thunderbolt78!
Den Batch kannst Du (fast) beliebig platzieren (in einem "results"-Ordner selbst wäre suboptimal
) - es werden immer alle unterhalb des angegebenen Basis-Ordners befindlichen "results"-Ordner erfasst (also für alle User en bloc) - allerdings wird nicht auf die Ordnertiefe geachtet, sodass auch ein Ordner "User1\Test1\Untertest1\Unteruntertest1\results" verarbeitet wird.
Grüße
bastla
Den Batch kannst Du (fast) beliebig platzieren (in einem "results"-Ordner selbst wäre suboptimal
Grüße
bastla
Hallo thunderbolt78!
Sollten Deine Ordner tatsächlich nicht "results", sondern zB "results (1000) dateien" heißen, kann mein Ansatz so natürlich nicht funktionieren, da nur "results" als Ordnername gesucht wird - wenn alle Ordner, deren Name nur mit "results" beginnt, gefragt wären, müsstest Du
Zeile 3 durch
und Zeile 28 durch
ersetzen - wenn denn die neuen Ordner konstant mit "resultsVon-Bis" benannt werden sollen.
Grüße
bastla
Sollten Deine Ordner tatsächlich nicht "results", sondern zB "results (1000) dateien" heißen, kann mein Ansatz so natürlich nicht funktionieren, da nur "results" als Ordnername gesucht wird - wenn alle Ordner, deren Name nur mit "results" beginnt, gefragt wären, müsstest Du
Zeile 3 durch
set "Ordner=results*"
set Verz=..\results%Von%-%Bis%
Grüße
bastla
Hallo thunderbolt78!
Ok - mit geändertem Basispfad für die neuen Ordner sähe das eher so aus:
Grüße
bastla
Ok - mit geändertem Basispfad für die neuen Ordner sähe das eher so aus:
@echo off & setlocal
set "Quelle=D:\Testordner"
set "Ordner=results"
set "Ziel=D:\Backup"
set "Anzahl=400"
for /f "delims=" %%i in ('dir /s/b/ad "%Quelle%\%Ordner%"') do call :ProcessDir "%%i"
goto :eof
:ProcessDir
echo Bearbeite %1
pushd %1
set "QuellPfad=%~dp1"
call set "ZielPfad=%%QuellPfad:%Quelle%=%Ziel%%%"
set /a Nr=0
set /a Bis=0
set /a Z=0
for /f "delims=" %%a in ('dir /b/a-d 2^>nul') do call :ProcessFile "%%a"
popd
echo #################################
goto :eof
:ProcessFile
set /a Z+=1
if %Z% leq %Bis% goto :MoveIt
set /a Nr+=1
set /a Von=(Nr-1)*Anzahl+1
set /a Bis=Nr*Anzahl
set /a Z=Von
set "Verz=%ZielPfad%%Ordner%%Von%-%Bis%
echo md %Verz%
:MoveIt
echo move %1 %Verz%
goto :eof
bastla
Hallo thunderbolt78!
Versuch es nochmal mit folgenden Zeilen 33 bis 36:
Es sollte auf jeden Fall eine Anzeige des/der Quellordner/s in der Art
erfolgen - falls Du nicht aus der CMD-Shell (sondern per Doppelklick) testest, könntest Du zwischen Zeile 7 und 8 eine Zeile
einfügen.
Wenn es noch immer nicht funktionieren sollte, ändere "
Grüße
bastla
P.S.: Verwende zum Posten von Code bitte die passende Formatierung.
Versuch es nochmal mit folgenden Zeilen 33 bis 36:
md "%Verz%" 2>nul
:MoveIt
move %1 "%Verz%"
goto :eof
Bearbeite "C:\Intel\user1\project1\results"
#################################
pause
Wenn es noch immer nicht funktionieren sollte, ändere "
echo off
" auf "echo on
" und sieh Dir den Ablauf des Batches in seinen Einzelheiten an ...Grüße
bastla
P.S.: Verwende zum Posten von Code bitte die passende Formatierung.
Hallo thunderbolt78!
Damit auch der (wenn alles geklappt hat) leere Ordner "results" entfernt wird, kannst Du die folgende ergänzte Version testen - in den Zeilen 22 und 30 könntest Du dann auch noch die Befehlszeile (in beiden Zeilen ist die gleiche Zeile zu verwenden) des von Dir verwendeten Packers (zip, rar) platzieren ...
Grüße
bastla
[Edit] Zeile 15 hinzugefügt, Zeilen 23 und 31 ergänzt (siehe unten) [/Edit]
User1\project1\results\results1-400
sollte überhaupt nicht entstehen, da ja für das Festlegen des Zielpfades nur der Teil "User1\project1\" verwendet wird (siehe Zeile 13) ...Damit auch der (wenn alles geklappt hat) leere Ordner "results" entfernt wird, kannst Du die folgende ergänzte Version testen - in den Zeilen 22 und 30 könntest Du dann auch noch die Befehlszeile (in beiden Zeilen ist die gleiche Zeile zu verwenden) des von Dir verwendeten Packers (zip, rar) platzieren ...
@echo off & setlocal
set "Quelle=C:\Intel"
set "Ordner=results"
set "Ziel=C:\Backup"
set "Anzahl=4"
for /f "delims=" %%i in ('dir /s/b/ad "%Quelle%\%Ordner%"') do call :ProcessDir "%%i"
goto :eof
:ProcessDir
echo Bearbeite %1
pushd %1
set "QuellPfad=%~dp1"
call set "ZielPfad=%%QuellPfad:%Quelle%=%Ziel%%%"
set "Verz="
set /a Nr=0
set /a Bis=0
set /a Z=0
for /f "delims=" %%a in ('dir /b/a-d 2^>nul') do call :ProcessFile "%%a"
popd
if defined Verz REM hier Befehl zum zippen des Ordners %Verz%
rd %1 2>nul
echo #################################
goto :eof
:ProcessFile
set /a Z+=1
if %Z% leq %Bis% goto :MoveIt
if defined Verz REM hier Befehl zum zippen des Ordners %Verz%
set /a Nr+=1
set /a Von=(Nr-1)*Anzahl+1
set /a Bis=Nr*Anzahl
set /a Z=Von
set "Verz=%ZielPfad%%Ordner%%Von%-%Bis%
md "%Verz%"
:MoveIt
move %1 "%Verz%"
goto :eof
bastla
[Edit] Zeile 15 hinzugefügt, Zeilen 23 und 31 ergänzt (siehe unten) [/Edit]
Hallo thunderbolt78!
Ich habe oben noch Zeile 15 hinzugefügt und die "Packer"-Zeilen so ergänzt, dass nur gepackt wird, wenn es auch bereits einen Zielordner gibt.
Der Aufruf in Zeile 31 startet das Packen bevor ein neuer Zielordner erstellt wird - dann ist der vorherige nämlich voll.
Wenn der letzte Ordner voll ist, wird die Zeile 31 nicht mehr erreicht - daher das Packen dieses Ordners in Zeile 23.
Grüße
bastla
Ich habe oben noch Zeile 15 hinzugefügt und die "Packer"-Zeilen so ergänzt, dass nur gepackt wird, wenn es auch bereits einen Zielordner gibt.
Der Aufruf in Zeile 31 startet das Packen bevor ein neuer Zielordner erstellt wird - dann ist der vorherige nämlich voll.
Wenn der letzte Ordner voll ist, wird die Zeile 31 nicht mehr erreicht - daher das Packen dieses Ordners in Zeile 23.
Grüße
bastla
Hallo thunderbolt78!
Ich hoffe, meine Fantasie hat auch genügt ...
Teste mal mit
Offen bleibt für mich die Frage des Komprimierens: Es werden ja jetzt bestehende Ordner, die voll sind, zwar nicht weiter befüllt - das Packen in Zeile 31 würde aber trotzdem erfolgen. Mit einer Überprüfung (per "
Ach ja, noch etwas: "
Grüße
bastla
Ich hoffe, meine Fantasie hat auch genügt ...
Teste mal mit
@echo off & setlocal
set "Quelle=C:\Intel"
set "Ordner=results"
set "Ziel=C:\Backup"
set "Anzahl=40"
for /f "delims=" %%i in ('dir /s/b/ad "%Quelle%\%Ordner%" 2^>nul') do call :ProcessDir "%%i"
goto :eof
:ProcessDir
echo Bearbeite %1
pushd %1
set "QuellPfad=%~dp1"
call set "ZielPfad=%%QuellPfad:%Quelle%=%Ziel%%%"
set "Verz="
set /a Nr=0
set /a Bis=0
set /a Z=0
for /f "delims=" %%a in ('dir /b/a-d 2^>nul') do call :ProcessFile "%%a"
popd
if defined Verz REM hier Befehl zum zippen des Ordners %Verz%
rd %1 2>nul
echo #################################
goto :eof
:ProcessFile
set /a Z+=1
if %Z% leq %Bis% goto :MoveIt
if defined Verz REM hier Befehl zum zippen des Ordners %Verz%
set /a Nr+=1
set /a Von=(Nr-1)*Anzahl+1
set /a Bis=Nr*Anzahl
set "Verz=%ZielPfad%%Ordner%%Von%-%Bis%
md "%Verz%" 2>nul
for /f %%i in ('dir "%Verz%" 2^>nul^|findstr "Datei(en)"') do set /a Z=Von+%%i
if %Z% gtr %Bis% (set /a Z=%Bis% & goto :ProcessFile)
:MoveIt
move %1 "%Verz%"
goto :eof
if exist
") ließe sich zwar das neuerliche Erstellen des ZIP-Files verhindern, allerdings würden dann Dateien, mit denen vorher noch nicht ganz volle Ordner aufgefüllt wurden, durch den Rost fallen ...Ach ja, noch etwas: "
move
" überschreibt kommentarlos bereits im Zielordner vorhandene gleichnamige Dateien.Grüße
bastla
Hallo thunderbolt78!
Der String, der gefunden werden soll, ist "Datei(en)" und daher bereits eingetragen - es sei denn, bei Deinem Betriebssystem würde in der vorletzten Zeile eines "
stehen.
Testen könntest Du übrigens auch mit 4 Dateien - das wäre bei einem "
Übrigens: Die ursprüngliche Struktur (die ich auch zum Testen verwende) hätte eigentlich unterhalb von "C:\Intel" noch einen "User"-Ordner und erst darin den Ordner "results" enthalten - soll das jetzt tatsächlich anders sein?
Grüße
bastla
Der String, der gefunden werden soll, ist "Datei(en)" und daher bereits eingetragen - es sei denn, bei Deinem Betriebssystem würde in der vorletzten Zeile eines "
dir
"-Befehls nicht die Anzahl der darin enthaltenen Dateien im Format 6 Datei(en) 1.565.096 Bytes
Testen könntest Du übrigens auch mit 4 Dateien - das wäre bei einem "
echo on
" in Zeile 1 etwas leichter nachzuvollziehen ...Übrigens: Die ursprüngliche Struktur (die ich auch zum Testen verwende) hätte eigentlich unterhalb von "C:\Intel" noch einen "User"-Ordner und erst darin den Ordner "results" enthalten - soll das jetzt tatsächlich anders sein?
Grüße
bastla
Hallo bastla,
ich habe diesen Beitrag gefunden und suche genau das!
Leider
läuft das Batch bei mir nicht ???
Ich weiß daß es gehen muß.
Kannst du bitte das Batch abändern?
Ich hab Windows 7.
Ich habe auf der Festplatte F:\
Ein Ordner mit Namen: Artikel
F:\Artikel
Im Ordner: Artikel
sind 18.000 .html Seiten drin.
Ich wollte jetzt gerne,
immer 1.000 .html Seiten Kopieren und in ein neu erstellten Ordner mit Namen: 1
erstellen lassen.
Im Ordner: 1 sind die ersten 1.000 html Seiten drin.
Im Ordner: 2 sind die nächsten 1.000 html Seiten drin usw.
Bis am Ende 1,2,3….bis 18 Ordner mit jeweils 1.000 html Seite drin sind.
Vielen Dank für deine Hilfe.
Gruß
Carlo
ich habe diesen Beitrag gefunden und suche genau das!
Leider
Ich weiß daß es gehen muß.
Kannst du bitte das Batch abändern?
Ich hab Windows 7.
Ich habe auf der Festplatte F:\
Ein Ordner mit Namen: Artikel
F:\Artikel
Im Ordner: Artikel
sind 18.000 .html Seiten drin.
Ich wollte jetzt gerne,
immer 1.000 .html Seiten Kopieren und in ein neu erstellten Ordner mit Namen: 1
erstellen lassen.
Im Ordner: 1 sind die ersten 1.000 html Seiten drin.
Im Ordner: 2 sind die nächsten 1.000 html Seiten drin usw.
Bis am Ende 1,2,3….bis 18 Ordner mit jeweils 1.000 html Seite drin sind.
Vielen Dank für deine Hilfe.
Gruß
Carlo