Umfangreiches Sortieren von Dateien in neue Unterverzeichnisse
Hallo ,
habe folgende Problemstellung:
Ich habe einen Ordner UNSORTIERT, mit ca. 500 Unterordnern, darin gibt es jeweils mehrere hundert Dateien.
Aus diesen Unterordnern sollen bestimmte Dateien (z.B. mit Jürgen Meier im Namen : Jürgen_Wünsche.txt oder Jürgen-Urlaub2001.jpg) in einen Neuen Ordner SORTIERT/Jürgen Meier verschoben werden.
Die Art der zu verschiebenden Dateien stehen in einer Liste (liste.txt)
Hallo ,
habe folgende Problemstellung:
Ich habe einen Ordner UNSORTIERT, mit ca. 500 Unterordnern, darin gibt es jeweils mehrere hundert Dateien.
Aus diesen Unterordnern sollen bestimmte Dateien (z.B. mit Jürgen Meier im Namen : Jürgen_Wünsche.txt oder Jürgen-Urlaub2001.jpg) in einen Neuen Ordner SORTIERT/Jürgen Meier verschoben werden.
Die Art der zu verschiebenden Dateien stehen in einer Liste (liste.txt)
Da der Zielordner nicht immer identisch mit dem Dateinamenbruchstück ist, steht hinter dem Trennzeichen der neu zu erstellende Zielordner.
*
LISTE.TXT :
J.M.=Jürgen Meier
Jürgen=Jürgen Meier
Jutta=Jutta Meier
Jumei=Jutta Meier
Otto
Karl
@=ENTWUERFE
*
Die Namen können sowohl am Anfang als auch in der Mitte des zu findenden Dateinamens stehen (bis auf @, steht immer am Anfang); Otto & Karl soll dabei immer in ein Unterverzeichnis SORTIERT/Otto bzw. /Karl verschoben werden, weil kein gesonderter Zielordner angegeben ist.
Wenn es möglich ist, sollte eine Datei die den gleichen Namen hat, automatisch eine Umbenennung erfahren, eventuell mit (1), (2) etc, oder
mit einem Zeitanhang _JJMMDDHHMMSShh; hier entweder das aktuelle Verschiebedatum oder das Erstelldatum:
Also Unsortiert/VZ1/otto1.jpg --> Sortiert/Otto/otto1.jpg
Unsortiert/VZ3/otto1.jpg --> Sortiert/Otto/otto1(1).jpg oder Sortiert/Otto/1_12093017521323.jpg
Unsortiert/VZ13/otto1.jpg --> Sortiert/Otto/otto1(2).jpg oder Sortiert/Otto/otto1_12093017540401.jpg
Unsortiert/VZ129/otto1.jpg --> Sortiert/Otto/otto1(3).jpg oder Sortiert/Otto/otto1_12093017540698.jpg
Es kommt darauf an, dass keine Datei durch Überschreiben verloren geht.
Mein erster Versuch sieht so aus:
Das KOPIEREN scheint zu funktionieren.
Noch etwas Wichtiges: Die Dateien sollen im ERNSTFALL nicht kopiert, wie im Skript momentan vorhanden, sondern bewegt (move) werden, das COPY steht nur im Moment der Testphase dort. Dies führt aber höchstwahrscheinlich noch zu weiteren Problemen, da beim MOVE auch die Verzeichnisnamen, die den Suchstring enthalten, sofort wegbewegt werden, samt Dateien, die gar nicht der Suchmaske entsprechen.
Allerdings arbeitet mein Skript bisher nur mit einer e i n f a c h e n Liste, und nicht mit der oben stehenden, gewünschten:
Liste(vorläufig).txt:
J.M.
Jürgen
Jutta
Jumei
Otto
Karl
D.h es wird immer ein neues VZ erstellt, wie die Namensbruchstücke gelistet sind, was ich aber so nicht will (J.M. sollte ja in ein VZ "Jürgen Meier" kopiert werden.
Wie bewerkstellige ich, daß ich mit "Liste.txt" arbeiten kann.
Ein noch groesseres Problem ist und bleibt aber das Problem des nicht Überschreibens! Und da habe ich noch nicht einmal die blasseste Ahnung, wie das gelöst werden könnte.
Es gibt einen Beitrag von BASTLA unter Gleichnamige Dateien in verschiedenen Ordnern, in einen Ordner kopieren und umbennen mit einem Lösungsansatz:
Doch wie binde ich das ein? Als absoluter Gelegenheitsbatchschreiber bin ich von all den Tokens and Delims dermaßen verwirrt, dass ich, wenn überhaupt,Tage bis Wochen bräuchte, um dass alles zusammen zu frickeln. Darum bitte ich die Profis unter Euch, mir mal ein wenig zu helfen.
Ich hoffe, mein Problem verständlich dargestellt zu haben und freue mich über jeden Hinweis
FF
habe folgende Problemstellung:
Ich habe einen Ordner UNSORTIERT, mit ca. 500 Unterordnern, darin gibt es jeweils mehrere hundert Dateien.
Aus diesen Unterordnern sollen bestimmte Dateien (z.B. mit Jürgen Meier im Namen : Jürgen_Wünsche.txt oder Jürgen-Urlaub2001.jpg) in einen Neuen Ordner SORTIERT/Jürgen Meier verschoben werden.
Die Art der zu verschiebenden Dateien stehen in einer Liste (liste.txt)
Hallo ,
habe folgende Problemstellung:
Ich habe einen Ordner UNSORTIERT, mit ca. 500 Unterordnern, darin gibt es jeweils mehrere hundert Dateien.
Aus diesen Unterordnern sollen bestimmte Dateien (z.B. mit Jürgen Meier im Namen : Jürgen_Wünsche.txt oder Jürgen-Urlaub2001.jpg) in einen Neuen Ordner SORTIERT/Jürgen Meier verschoben werden.
Die Art der zu verschiebenden Dateien stehen in einer Liste (liste.txt)
Da der Zielordner nicht immer identisch mit dem Dateinamenbruchstück ist, steht hinter dem Trennzeichen der neu zu erstellende Zielordner.
*
LISTE.TXT :
J.M.=Jürgen Meier
Jürgen=Jürgen Meier
Jutta=Jutta Meier
Jumei=Jutta Meier
Otto
Karl
@=ENTWUERFE
*
Die Namen können sowohl am Anfang als auch in der Mitte des zu findenden Dateinamens stehen (bis auf @, steht immer am Anfang); Otto & Karl soll dabei immer in ein Unterverzeichnis SORTIERT/Otto bzw. /Karl verschoben werden, weil kein gesonderter Zielordner angegeben ist.
Wenn es möglich ist, sollte eine Datei die den gleichen Namen hat, automatisch eine Umbenennung erfahren, eventuell mit (1), (2) etc, oder
mit einem Zeitanhang _JJMMDDHHMMSShh; hier entweder das aktuelle Verschiebedatum oder das Erstelldatum:
Also Unsortiert/VZ1/otto1.jpg --> Sortiert/Otto/otto1.jpg
Unsortiert/VZ3/otto1.jpg --> Sortiert/Otto/otto1(1).jpg oder Sortiert/Otto/1_12093017521323.jpg
Unsortiert/VZ13/otto1.jpg --> Sortiert/Otto/otto1(2).jpg oder Sortiert/Otto/otto1_12093017540401.jpg
Unsortiert/VZ129/otto1.jpg --> Sortiert/Otto/otto1(3).jpg oder Sortiert/Otto/otto1_12093017540698.jpg
Es kommt darauf an, dass keine Datei durch Überschreiben verloren geht.
Mein erster Versuch sieht so aus:
@echo off & setlocal
FOR /f "usebackq delims==" %%a IN (liste.txt) DO (
if not exist c:\versuch\tmp\%%a mkdir c:\versuch\tmp\%%a
echo findet alle Dateien mit Namen %%a am Anfang:
dir /s/b %%a*.* > tmp.txt
rem findet alle Dateien mit Namen %%a in der Mitte:
dir /s/b *%%a*.* >> tmp.txt
FOR /f "usebackq delims==" %%b IN (tmp.txt) DO copy /-Y "%%b" c:\versuch\tmp\%%a
echo "FOR /f "usebackq delims==" %%b IN (test.txt) DO copy /-Y "%%b" c:\versuch\tmp\%%b"
)
Das KOPIEREN scheint zu funktionieren.
Noch etwas Wichtiges: Die Dateien sollen im ERNSTFALL nicht kopiert, wie im Skript momentan vorhanden, sondern bewegt (move) werden, das COPY steht nur im Moment der Testphase dort. Dies führt aber höchstwahrscheinlich noch zu weiteren Problemen, da beim MOVE auch die Verzeichnisnamen, die den Suchstring enthalten, sofort wegbewegt werden, samt Dateien, die gar nicht der Suchmaske entsprechen.
Allerdings arbeitet mein Skript bisher nur mit einer e i n f a c h e n Liste, und nicht mit der oben stehenden, gewünschten:
Liste(vorläufig).txt:
J.M.
Jürgen
Jutta
Jumei
Otto
Karl
D.h es wird immer ein neues VZ erstellt, wie die Namensbruchstücke gelistet sind, was ich aber so nicht will (J.M. sollte ja in ein VZ "Jürgen Meier" kopiert werden.
Wie bewerkstellige ich, daß ich mit "Liste.txt" arbeiten kann.
Ein noch groesseres Problem ist und bleibt aber das Problem des nicht Überschreibens! Und da habe ich noch nicht einmal die blasseste Ahnung, wie das gelöst werden könnte.
Es gibt einen Beitrag von BASTLA unter Gleichnamige Dateien in verschiedenen Ordnern, in einen Ordner kopieren und umbennen mit einem Lösungsansatz:
for /F "tokens=1* delims=:" %%i in ('findstr /n "^" test.bak')
do for /f "tokens=1* delims=:" %%x in ('findstr /n "^"
namen.bak^|findstr /b "%%i:"')
do echo copy "%%j" "C:\test\%%y.jpg"
Doch wie binde ich das ein? Als absoluter Gelegenheitsbatchschreiber bin ich von all den Tokens and Delims dermaßen verwirrt, dass ich, wenn überhaupt,Tage bis Wochen bräuchte, um dass alles zusammen zu frickeln. Darum bitte ich die Profis unter Euch, mir mal ein wenig zu helfen.
Ich hoffe, mein Problem verständlich dargestellt zu haben und freue mich über jeden Hinweis
FF
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 192109
Url: https://administrator.de/forum/umfangreiches-sortieren-von-dateien-in-neue-unterverzeichnisse-192109.html
Ausgedruckt am: 19.04.2025 um 06:04 Uhr
9 Kommentare
Neuester Kommentar
moin freckeldfrickler,
wie genau ist denn der Dateiname aufgebaut?
mit Unterstrich bzw Mittestrich als Trenner vom Namen zu den Daten
Gibt es dann auch keinen weiteren Unterstrich bzw. Mittstrich im Dateinamen?
Kannst Du beim Erstellungsdatum sicherstellen, dass die Dateien immer ein anderes Erstellungsdatum haben?
Setz bitte den Code nicht in Fettschrifft sondern in Codeblöcke.
wie es geht steht in diesem Abschnitt: Verfassen
Gruß Phil
wie genau ist denn der Dateiname aufgebaut?
mit Unterstrich bzw Mittestrich als Trenner vom Namen zu den Daten
Namensteil_Datenteil.txt
N.T.-Datenteil.jpg
Kannst Du beim Erstellungsdatum sicherstellen, dass die Dateien immer ein anderes Erstellungsdatum haben?
Setz bitte den Code nicht in Fettschrifft sondern in Codeblöcke.
wie es geht steht in diesem Abschnitt: Verfassen
Gruß Phil

moinsen,
mal was ganz anderes....
Wenn 3* Ja, dann ist das ganz "einfach"....
Dir /a-d /q
Gruß
mal was ganz anderes....
- ist das ein Windows Server, auf dem die Daten liegen?
- Vielleicht sogar ein NTFS Volume?
- Und die Schüler sind "zufälligerweise" in der AD angelegt?
Wenn 3* Ja, dann ist das ganz "einfach"....
Dir /a-d /q
Gruß
moin,
Irgendwie müssen die Daten ja auf das Volume drauf gekommen sein.
Da könnte von dem Ursprungort mit NTFS auch der Besitzer gefiltert werden. So wie von LimboSeil der Gedanke.
Aber für so ein Durcheinander von Mustern, ist es schon etwas schwierig eine komplette Automatik zu basteln.
Ist in den einzelnen Unterordnern (VZ1 VZ2 etc. ...) von allen Schüler immer nur eine Datei bzw ein Satz von Daten drin, sprich die komplette Klasse wurde in einem Unterordner für ein Projekt eingesammelt?
Oder gibt es mehrere Projekte eines Schülers in einem Ordner?
Wie soll sonst ein SchülerNamensbestandteil einer Datei von einem ProjektNamen unterschieden werden?
Eine grobe Vorsortierung mit einem Batch würde zwar gehen, aber es müsste immer alles Kontrolliert werden.
Für so einen Fall habe ich eine Batch, welche mir erst die Ordnerstruktur und Mögliche Kopier- /Verschiebeaktionen je Zeile auflistet.
Bei seperaten Ordnern auch Namen.
Diese Liste schaue ich mir an und kann danach den Batch verfeinern.
Ist die Liste von mir abgesegnet, greift erst dann Teil zwei des Batches mit den Verschieben.
Gruß Phil
Irgendwie müssen die Daten ja auf das Volume drauf gekommen sein.
Da könnte von dem Ursprungort mit NTFS auch der Besitzer gefiltert werden. So wie von LimboSeil der Gedanke.
>for /f "tokens=2delims=\:" %i in (' cacls Dateiname ^|find /i " %computername%" '
) do @echo Benuzter=%i
Aber für so ein Durcheinander von Mustern, ist es schon etwas schwierig eine komplette Automatik zu basteln.
Ist in den einzelnen Unterordnern (VZ1 VZ2 etc. ...) von allen Schüler immer nur eine Datei bzw ein Satz von Daten drin, sprich die komplette Klasse wurde in einem Unterordner für ein Projekt eingesammelt?
Oder gibt es mehrere Projekte eines Schülers in einem Ordner?
Wie soll sonst ein SchülerNamensbestandteil einer Datei von einem ProjektNamen unterschieden werden?
Eine grobe Vorsortierung mit einem Batch würde zwar gehen, aber es müsste immer alles Kontrolliert werden.
Für so einen Fall habe ich eine Batch, welche mir erst die Ordnerstruktur und Mögliche Kopier- /Verschiebeaktionen je Zeile auflistet.
Bei seperaten Ordnern auch Namen.
Diese Liste schaue ich mir an und kann danach den Batch verfeinern.
Ist die Liste von mir abgesegnet, greift erst dann Teil zwei des Batches mit den Verschieben.
Gruß Phil
Eine Variable innerhalb einer Klammer muss mit delayedexpansion aufgelöst werden.
Dies ist aber nicht nötig, wenn Du die Variable so wie Du sie Benötigst Nicht veränderst, denn sie ist ja schon in der For-Variable %%a enthalten.
Es gibt hier auch einige gute Tutorials im Batch Bereich.
Für den Anfang kannst Du das Ganze so lösen:
Gruß Phil
Dies ist aber nicht nötig, wenn Du die Variable so wie Du sie Benötigst Nicht veränderst, denn sie ist ja schon in der For-Variable %%a enthalten.
Es gibt hier auch einige gute Tutorials im Batch Bereich.
Für den Anfang kannst Du das Ganze so lösen:
;testnamen.txt
;Zeilen mit Semikolon sind Kommentarzeilen
J.M.=Jürgen Meier
Jürgen=Jürgen Meier
Jutta=Jutta Meier
Jumei=Jutta Meier
Otto
Karl
;wenn Entwürfe zuerst behandelt werden also vorher
;kann nach Priorität erst diese Markierung verschoben werden
@=ENTWUERFE
@echo off
setlocal
:: echo on
set "Quelle=D:\adtest\alt"
set "Ziel=D:\adtest\neu"
set "Namen=D:\adtest\testnamen.txt"
set "TempN=%temp%\Namenliste850.txt"
rem Liste mit Umlauten cmd tauglich umschreiben
chcp 1252 >nul
3>"%TempN%" (
for /f "usebackqtokens=1*delims==" %%a in ("%namen%") do for /f "tokens=2delims=:" %%b in ("%%a:%%b:%%a") do chcp 850 >nul &>&3 cmd /c "echo %%a:%%b:"&chcp 1252 >nul
)
chcp 850 >nul
rem Dursuche Verzeichnis mit Liste
for /f "usebackqtokens=1,2delims=:" %%a in ("%tempN%") do (
rem BenutzerName länge bestimmen
set "BName=%%a"
for /f %%c in ('cmd /u /von /c "echo !BName!"^|more^|findstr .^|find /c /v "" ') do set /a LN=%%c , LkN=ln-1
set "BPfad=%%b"
for /r "%quelle%" %%i in ("*%%a*" ) do (
if not exist "%ziel%\%%b\" md "%ziel%\%%b"
set "FName=%%~dpi"
set "Datei=%%~ni"
set "DNameNeu=%%~ni"
call :Namecheck %%~xi
) )
exit /b
:Namecheck
setlocal enabledelayedexpansion
for /f "delims=" %%i in ("!datei:%Bname%=!" ) do endlocal & set "DNameNeu=%%~i"
if "%Datei%" neq "%Dnameneu%" set "DNameNeu=[%BPfad%]%Dnameneu%" &goto :findDouble
:Nameset
rem wenn Name nicht Case sensitiv gefunden!
rem zeige Offsets vom 1.des Benutzernamens im Dateiname zum Vergleichen
for /f "delims=" %%I in (' cmd /u /von /c "echo !datei:~0^,-%lkn%!"^|find /i /n "%Datei:~0,1%" ') do (
echo %%I
set /a V =%%I -1 ,H =V +LN
setlocal enabledelayedexpansion
for /f "tokens=1-2" %%J in ("!V! !H!") do (
echo %%J
if /i !Datei:~%%J^,%LN%! equ !BName! if !Datei! equ !DnameNeu! for /f "delims=" %%J in ("[!BPfad!]!Datei:~0,%%J!!Datei:~%%K!") do endlocal &set "DnameNeu=%%J"
)
)
:findDouble
set "Timestamp="
rem Bei Timestamp anpassen mit :: goto
goto :NoTimestamp
rem Timestamp mit Sekunden liefert Robocopy
for /f "tokens=1-7* delims=/: " %%S in (' 2^>nul robocopy /L /ts /fp /bytes /np /nc /ndl /njh /njs "%FName:~0,-1%" "D:\irgendetwasesnochnichtgibt" "%Datei%%1"') do set "Timestamp= [%%T%%U%%V%%W%%X%%Y]" &rem Groesse=%%S ,"Name=%%Z"
:NoTimestamp
rem wenn doubletten als extra Datei verschoben werden sollen
set "double="
:: goto :nodouble
(for /f %%A in (' ^( echo(. ^&2^>nul dir /b "%ziel%\%BPfad%\%DnameNeu%%Timestamp%%1" "%ziel%\%BPfad%\%DnameNeu%%Timestamp% (*)%1" ^) ^|find /c /v "" ^|findstr /vx "0 1" ') do set "double= (%%A)" ) || set "double="
:nodouble
@echo move "%FName%%Datei%%1" "%ziel%\%BPfad%\%DnameNeu%%Timestamp%%double%%1"
:: move "%FName%%Datei%%1" "%ziel%\%BPfad%\%DnameNeu%%Timestamp%%double%%1"
exit /b
Gruß Phil