Dateien in Abhängigkeit des Dateinamens auf eine bestimmte Zeichenzahl kürzen und verschieben
Hallo zusammen,
ich habe zwei Probleme, bei denen ich auf Eure kompotente Hilfe hoffe:
Problem 1:
Ich habe sehr viele Dateien mit dem Windows-Explorer umbenannt. Diese tragen jetzt alle eine automatisch generierte Nummerierung im Dateinamen, die offenbar im Windows-Explorer beim Umbenennen mehrerer Dateien offenbar nicht vermeidbar ist (oder liege ich falsch?).
Diese Nummerierung möchte ich gerne entfernen.
Die Dateien sind in verschiedenen Unterordnern des Ordners U:\Test abgelegt. Es sollen nur diejenigen Dateinamen gekürzt werden, die die Zeichenfolge "Blume_" im Dateinamen enthalten.
vorher:
Blume_01 (1)
Blume_02 (1)
...
Blume_15 (1)
nachher:
Blume_01
Blume_02
...
Blume_15
Problem 2:
In einem zweiten Schritt möchte ich die Dateien in einen bestimmten Unterordner verschieben. Die Ordnerstruktur sieht wie folgt aus:
U:\Test\Karl\schwarz
U:\Test\Karl\weiß
U:\Test\Fritz\schwarz
U:\Test\Fritz\weiß
U:\Test\Max\schwarz
U:\Test\Max\weiß
U:\Test\Paul\schwarz
U:\Test\Paul\weiß
...
Die Dateien liegen teilweise direkt in den Ordnern Karl,Fritz,Max,Paul etc. und teilweise in den Unterordnern "schwarz" und "weiß".
Ich möchte alle Dateien, die die Zeichenfolge "Blume_" im Dateinamen enthalten in den Ordner "schwarz" des jeweiligen Pfads verschieben.
Ich hoffe Ihr könnt mir weiterhelfen.
Vielen Dank schonmal.
Gruß Markus
ich habe zwei Probleme, bei denen ich auf Eure kompotente Hilfe hoffe:
Problem 1:
Ich habe sehr viele Dateien mit dem Windows-Explorer umbenannt. Diese tragen jetzt alle eine automatisch generierte Nummerierung im Dateinamen, die offenbar im Windows-Explorer beim Umbenennen mehrerer Dateien offenbar nicht vermeidbar ist (oder liege ich falsch?).
Diese Nummerierung möchte ich gerne entfernen.
Die Dateien sind in verschiedenen Unterordnern des Ordners U:\Test abgelegt. Es sollen nur diejenigen Dateinamen gekürzt werden, die die Zeichenfolge "Blume_" im Dateinamen enthalten.
vorher:
Blume_01 (1)
Blume_02 (1)
...
Blume_15 (1)
nachher:
Blume_01
Blume_02
...
Blume_15
Problem 2:
In einem zweiten Schritt möchte ich die Dateien in einen bestimmten Unterordner verschieben. Die Ordnerstruktur sieht wie folgt aus:
U:\Test\Karl\schwarz
U:\Test\Karl\weiß
U:\Test\Fritz\schwarz
U:\Test\Fritz\weiß
U:\Test\Max\schwarz
U:\Test\Max\weiß
U:\Test\Paul\schwarz
U:\Test\Paul\weiß
...
Die Dateien liegen teilweise direkt in den Ordnern Karl,Fritz,Max,Paul etc. und teilweise in den Unterordnern "schwarz" und "weiß".
Ich möchte alle Dateien, die die Zeichenfolge "Blume_" im Dateinamen enthalten in den Ordner "schwarz" des jeweiligen Pfads verschieben.
Ich hoffe Ihr könnt mir weiterhelfen.
Vielen Dank schonmal.
Gruß Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 319295
Url: https://administrator.de/contentid/319295
Ausgedruckt am: 25.11.2024 um 15:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo Markus,
teste mal folgendes:
Grüße
Friemler
teste mal folgendes:
@echo off & setlocal
set "RootDir=U:\Test"
set "FileNamePattern=Blume_*"
set "CopyToDir=schwarz"
::Dateien umbenennen
for /r "%RootDir%" %%a in ("%FileNamePattern%") do (
for /f "delims=(" %%b in ("%%a") do (
ren "%%a" "%%~nb%%~xa" 1>NUL
)
)
::Dateien verschieben
for /d %%a in ("%RootDir%\*.*") do (
move "%%a\%FileNamePattern%" "%%a\%CopyToDir%" 1>NUL 2>NUL
for /d %%b in ("%%a\*.*") do (
if /i "%%~nb" neq "%CopyToDir%" (
move "%%b\%FileNamePattern%" "%%a\%CopyToDir%" 1>NUL 2>NUL
)
)
)
Grüße
Friemler
Hallo Markus,
bevor wir hier weitermachen:
1. Wie viele Verzeichnisebenen sollen es den werden? Bleibt es fix bei drei Ebenen (unterhalb der Startebene
Abhängig von der Antwort auf diese Frage ergeben sich u.U. noch weitere Fragen:
2. Auf welchen Verzeichnisebenen können die zu verschiebenden Dateien liegen?
3. Gibt es die Verzeichnisse
Abhängig von der Antwort auf Frage 3:
4. Wie wird das Zielverzeichnis bestimmt?
Grüße
Friemler
bevor wir hier weitermachen:
1. Wie viele Verzeichnisebenen sollen es den werden? Bleibt es fix bei drei Ebenen (unterhalb der Startebene
U:\Test
) oder können es auch zwei ODER drei sein oder noch mehr?Abhängig von der Antwort auf diese Frage ergeben sich u.U. noch weitere Fragen:
2. Auf welchen Verzeichnisebenen können die zu verschiebenden Dateien liegen?
3. Gibt es die Verzeichnisse
schwarz
und weiß
immer nur auf der vorletzten Verzeichnisebene oder auch darüber (gibt es also nur Paul\FARBE\schwarz
und Paul\FARBE\weiß
oder auch weiterhin Paul\schwarz
und Paul\weiß
)?Abhängig von der Antwort auf Frage 3:
4. Wie wird das Zielverzeichnis bestimmt?
Grüße
Friemler
Hallo Markus,
zunächst mal das geänderte Script:
In den Zeilen 6 und 7 bzw. 9 und 10 werden Gruppen von Dateierweiterungen und die zugehörigen Zielverzeichnisse definiert. Falls Du weitere Gruppen und Zielverzeichnisse benötigst musst Du sie hier ergänzen (z.B.
Außerdem musst Du dann auch weiter unten Aufrufe der Unterprogramme
Grüße
Friemler
zunächst mal das geänderte Script:
@echo off & setlocal
set "RootDir=U:\Test"
set "FileNamePattern=Blume_*"
set "FileTypes1=.xlsx .xlsm"
set "FileTypes1CopyToDir=schwarz"
set "FileTypes2=.csv .svd .sv2"
set "FileTypes2CopyToDir=weiß"
::Dateien umbenennen
for /r "%RootDir%" %%a in ("%FileNamePattern%") do (
for /f "delims=(" %%b in ("%%a") do (
ren "%%a" "%%~nb%%~xa" 1>NUL
)
)
::Dateien verschieben
for /d %%a in ("%RootDir%\*.*") do (
for /d %%b in ("%%a\*.*") do (
call :MoveFilesInDir "%%b" "%FileNamePattern%" "%FileTypes1%" "%FileTypes1CopyToDir%"
call :MoveFilesInDir "%%b" "%FileNamePattern%" "%FileTypes2%" "%FileTypes2CopyToDir%"
for /d %%c in ("%%b\*.*") do (
call :MoveFilesInSubDir "%%c" "%FileNamePattern%" "%FileTypes1%" "%FileTypes1CopyToDir%"
call :MoveFilesInSubDir "%%c" "%FileNamePattern%" "%FileTypes2%" "%FileTypes2CopyToDir%"
)
)
)
exit /b 0
:MoveFilesInDir
for %%z in ("%~1\%~2") do (
echo %%z|findstr /iel "%~3" 1>NUL 2>NUL && (
move "%%z" "%~1\%~4" 1>NUL 2>NUL
)
)
exit /b 0
:MoveFilesInSubDir
if /i "%~nx1" neq "%~4" (
for %%z in ("%~1\%~2") do (
echo %%z|findstr /iel "%~3" 1>NUL 2>NUL && (
move "%%z" "%~dp1%~4" 1>NUL 2>NUL
)
)
)
exit /b 0
In den Zeilen 6 und 7 bzw. 9 und 10 werden Gruppen von Dateierweiterungen und die zugehörigen Zielverzeichnisse definiert. Falls Du weitere Gruppen und Zielverzeichnisse benötigst musst Du sie hier ergänzen (z.B.
FileTypes3
und FileTypes3CopyToDir
).Außerdem musst Du dann auch weiter unten Aufrufe der Unterprogramme
MoveFilesInDir
(Zeile 24 und 25) bzw. MoveFilesInSubDir
(Zeile 28 und 29) ergänzen. Für jede Gruppe von Dateierweiterungen einen Aufruf, in den Du die passenden Variablen einbauen musst.Grüße
Friemler
Hallo Markus,
wenn Du NUR Dateien aus der "Karl-Fritz-Max-Paul"-Ebene verabeiten willst, musst Du
Das Unterprogramm
Wie funktioniert's?
Die äußere
Die (zu löschende)
Das Unterprogramm
Die
Passende Dateien werden in Zeile 41 verschoben. Dafür nutze ich die bedingte Befehlsverkettung mit dem
Das (zu löschende) Unterprogramm
Für zukünftige Anpassungen durch Dich:
Zusätzliche Verzeichnisebenen kannst Du durch das Einfügen weiterer
Wenn Du mit den Buchstaben a-z für die Namen der
Wenn Du magst, kannst Du Dir auch mein Tutorial zur FOR-Schleife durchlesen, könnte bei eigenen Änderungen hilfreich sein. Tipp: Lies nicht alles sondern nur was Du für Deine Aufgabe wirklich brauchst, sonst wird es zu viel.
Grüße
Friemler
wenn Du NUR Dateien aus der "Karl-Fritz-Max-Paul"-Ebene verabeiten willst, musst Du
- die
FOR
-Schleife in Zeile 23 beseitigen (Zeile 23 und 31 löschen), - die
FOR
-Schleife in Zeile 27 mit Inhalt beseitigen (Zeile 27 bis 29 löschen) und - in Zeile 24 und 25
"%%b"
durch"%%a"
austauschen (die Laufvariable der gelöschten Schleife ersetzen).
Das Unterprogramm
MoveFilesInSubDir
kannst Du dann auch komplett entsorgen.Wie funktioniert's?
Die äußere
FOR
-Schleife in Zeile 22 liefert alle Verzeichnisse unterhalb des Startverzeichnisses RootDir
. Das ist die "Karl-Fritz-Max-Paul"-Ebene.Die (zu löschende)
FOR
-Schleife in Zeile 23 liefert alle Verzeichnisse unterhalb der "Karl-Fritz-Max-Paul"-Ebene, also die "FARBE"-Ebene, deshalb muss diese Schleife weg.Das Unterprogramm
MoveFilesInDir
wird mit dem Pfad der aktuellen Ebene aufgerufen (in der bisherigen Version des Scripts z.B. mit U:\Test\Fritz\FARBE
, nach der Änderung mit U:\Test\Fritz
).Die
FOR
-Schleife in Zeile 39 ermittelt alle Dateien in diesem Verzeichnis, die auf die Dateimaske passen. Da diese nur für den Dateinamen gilt, filtere ich in Zeile 40 mit FINDSTR
alle Dateien heraus, auf die die Liste der Dateinamenserweiterungen passt.Passende Dateien werden in Zeile 41 verschoben. Dafür nutze ich die bedingte Befehlsverkettung mit dem
&&
-Operator (führe den nächsten Befehl nur aus, wenn der vorhergehende erfolgreich war, in dem Fall wenn FINDSTR
eine passende Datei gefunden hat).Das (zu löschende) Unterprogramm
MoveFilesInSubDir
steigt durch die FOR
-Schleife in Zeile 49 nochmals eine Verzeichnisebene nach unten und verarbeitet die Dateien auf der ""schwarz-weiß"-Ebene nach dem gleichen Verfahren wie das andere Unterprogramm. Hier muss nur zusätzlich noch beachtet werden, dass Quell- und Zielverzeichnis ungleich sind, das erledigt Zeile 48.Für zukünftige Anpassungen durch Dich:
Zusätzliche Verzeichnisebenen kannst Du durch das Einfügen weiterer
FOR
-Schleifen wie in Zeile 23 abdecken, weniger Ebenen durch das Entfernen dieser Schleifen. Dabei musst Du nur darauf achten, dass beim Aufruf des Unterprogramms MoveFilesInDir
die korrekte FOR
-Laufvariable übergeben wird.Wenn Du mit den Buchstaben a-z für die Namen der
FOR
-Laufvariablen nicht auskommst , kannst Du dann noch A-Z verwenden, Groß-/Kleinschreibung wird bei den Variablennamen unterschieden.Wenn Du magst, kannst Du Dir auch mein Tutorial zur FOR-Schleife durchlesen, könnte bei eigenen Änderungen hilfreich sein. Tipp: Lies nicht alles sondern nur was Du für Deine Aufgabe wirklich brauchst, sonst wird es zu viel.
Grüße
Friemler
Hallo Markus,
na ja, war doch ein wenig spät gestern und ich hatte keine Lust mehr, das was ich in meinem Posting verzapft hatte, auch zu testen. Aber Du konntest Dir ja selbst helfen, freut mich. Am meisten lernt man sowieso daraus, die Fehler von anderen zu verbessern, so geht es mir zumindest.
Grüße
Friemler
na ja, war doch ein wenig spät gestern und ich hatte keine Lust mehr, das was ich in meinem Posting verzapft hatte, auch zu testen. Aber Du konntest Dir ja selbst helfen, freut mich. Am meisten lernt man sowieso daraus, die Fehler von anderen zu verbessern, so geht es mir zumindest.
Grüße
Friemler