Batch um Dateien aus Unterordnern in den ersten Unterordner zu verschieben
Hallo an alle erst einmal.
Wie sich herrausgestellt hat, habe ich ein etwas komplexeres Problem (zumindest für mich).
In einem Ordner D:\Daten\ befinden sich nach einem automatischen Suchlauf viele verschiedene
Unterordner, deren Namen wie folgt aufgebaut sind: regionaltimes.com aber auch www.dailytimes.com.pk, usw.
In diesen ersten Unterordnern (im Folgenden nur noch U1) können sich zig verschiedene Dateien
und weitere Unterordner beliebiger Tiefe befinden (z.B. D:\Daten\regionaltimes.com\Ordner1\Ordner2\Ordner3\Datei).
Mein Ziel ist es nun, sämtliche Dateien aus den Unterordnern in einem Batchlauf (oder auch mittels VBS) in die
entsprechenden U1 zu verschieben (die leeren Unterordner lösche ich später mit einem extra Batch, das habe ich
bereits gelöst). Leider habe ich bislang keine passende Lösung gefunden, da ein Vorgehen meiner Ansicht
nach ja wie folgt ablaufen müsste:
- öffnen des Ordners D:\Daten\
- Suchlauf durch alle U1, wobei der Ordnername U1 gemerkt werden müsste, da hierher ja später die Dateien
verschoben werden sollen
- U1 und sämtliche Unterordner nach *.* (alle Dateien) durchsuchen und diese dann mit move %1\*.* U1\*.* verschieben
Leider komme ich mit meinen Grundkenntnissen nicht wirklich weiter und habe wie gesagt auch noch nichts
passendes via google-Suche gefunden.
Vll. kann mir ja einer von den Profis hier helfen.
Vielen Dank schon mal im voraus.
Wie sich herrausgestellt hat, habe ich ein etwas komplexeres Problem (zumindest für mich).
In einem Ordner D:\Daten\ befinden sich nach einem automatischen Suchlauf viele verschiedene
Unterordner, deren Namen wie folgt aufgebaut sind: regionaltimes.com aber auch www.dailytimes.com.pk, usw.
In diesen ersten Unterordnern (im Folgenden nur noch U1) können sich zig verschiedene Dateien
und weitere Unterordner beliebiger Tiefe befinden (z.B. D:\Daten\regionaltimes.com\Ordner1\Ordner2\Ordner3\Datei).
Mein Ziel ist es nun, sämtliche Dateien aus den Unterordnern in einem Batchlauf (oder auch mittels VBS) in die
entsprechenden U1 zu verschieben (die leeren Unterordner lösche ich später mit einem extra Batch, das habe ich
bereits gelöst). Leider habe ich bislang keine passende Lösung gefunden, da ein Vorgehen meiner Ansicht
nach ja wie folgt ablaufen müsste:
- öffnen des Ordners D:\Daten\
- Suchlauf durch alle U1, wobei der Ordnername U1 gemerkt werden müsste, da hierher ja später die Dateien
verschoben werden sollen
- U1 und sämtliche Unterordner nach *.* (alle Dateien) durchsuchen und diese dann mit move %1\*.* U1\*.* verschieben
Leider komme ich mit meinen Grundkenntnissen nicht wirklich weiter und habe wie gesagt auch noch nichts
passendes via google-Suche gefunden.
Vll. kann mir ja einer von den Profis hier helfen.
Vielen Dank schon mal im voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 11.08.2010 um 10:36:49 Uhr
Zitat von @00Snickers:am 11.08.2008
...in U1 liegt. Falls nein, dann move. Falls ja, dann die Datei umbennen in Dateiname + "_" + Inkrement.
Set /a rgc+=1...in U1 liegt. Falls nein, dann move. Falls ja, dann die Datei umbennen in Dateiname + "_" + Inkrement.
#696
Content-ID: 148406
Url: https://administrator.de/contentid/148406
Ausgedruckt am: 07.11.2024 um 20:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo 00Snickers und willkommen im Forum!
Die Frage bei allen derartigen Vorhaben ist immer: Wie soll bei Namensgleichheit von Dateien vorgegangen werden?
Ansonsten würde sich das (ungetestet) auf etwa
reduzieren ...
Das "
Grüße
bastla
Die Frage bei allen derartigen Vorhaben ist immer: Wie soll bei Namensgleichheit von Dateien vorgegangen werden?
Ansonsten würde sich das (ungetestet) auf etwa
@echo off & setlocal
set "Basis=D:\Daten"
for /d %%i in ("%Basis%\*.*") do (
pushd "%%i"
for /f "delims=" %%a in ('dir /s /b /a-d 2^>nul') do echo move "%%a"
popd
)
Das "
echo
" vor dem "move
" soll ein gefahrloses Testen erlauben - ob mehrere gleichnamige Dateien in den Zielordner verschoben (und damit immer die jeweils bereits Vorhandenen überschrieben) würden, lässt sich damit aber nicht feststellen. Nur zur Sicherheit: Ein in einem Batch verwendetes "move
" überschreibt ohne Rückfrage (entspricht dem Schalter "/Y")!Grüße
bastla
Moin 00Snickers,
willkommen im Forum.
bastla hat sich ja schon der eigentlichen Frage angenommen.
Lass mich noch mal die Sinnhaftigkeit dieses Vorgehens hinterfragen.
Wenn du bisher eine Unterverzeichnisstruktur nach diesem Suchlauf vorliegen hast, dann hast du so oder so nach der Verschieberei einen Informationsverlust
a) weil die Verzeichnisstruktur fehlt und vielleicht einzelne Dateien in den Unterordnern nur in Verbindung mit anderen Dateien in der Unterverzeichnisstruktur interpretierbar sind
b) weil die Wahrscheinlichkeit, dass es keine Dateinamenskollisionen gibt weit unter dem IQ von Paris Hilton liegt. Und da musst diu dich dann zwangsweise von irgendwelchen Originaldaten trennen.
... irgendwie schimmert der große Plan des ganzen Unterfangens noch nicht so richtig durch.
Grüße
Biber
willkommen im Forum.
bastla hat sich ja schon der eigentlichen Frage angenommen.
Lass mich noch mal die Sinnhaftigkeit dieses Vorgehens hinterfragen.
Wenn du bisher eine Unterverzeichnisstruktur nach diesem Suchlauf vorliegen hast, dann hast du so oder so nach der Verschieberei einen Informationsverlust
a) weil die Verzeichnisstruktur fehlt und vielleicht einzelne Dateien in den Unterordnern nur in Verbindung mit anderen Dateien in der Unterverzeichnisstruktur interpretierbar sind
b) weil die Wahrscheinlichkeit, dass es keine Dateinamenskollisionen gibt weit unter dem IQ von Paris Hilton liegt. Und da musst diu dich dann zwangsweise von irgendwelchen Originaldaten trennen.
- Wäre es nicht sinnvoller, die gesammelten Dateien Unterverzeichnisse mit Struktur und allen Dateien zusammenzudampfen mit Rar/Zip/7z/Zoo oder irgendeinem Packprogramm?
- Und welche der Details deiner Sammelei brauchst du denn überhaupt jemals wieder und WTF wofür?
... irgendwie schimmert der große Plan des ganzen Unterfangens noch nicht so richtig durch.
Grüße
Biber
Hallo 00Snickers!
Der Hilfe zu "
Mit "
Grüße
bastla
Was ich noch nicht verstehe ist, was die Eingabe " /a-d^>nul " ... bewirkt
Ohne die "2" wäre sie kontraproduktiv ... Der Hilfe zu "
dir
" (also "dir /?
") kannst Du entnehmen, dass mit "/a" bestimmte "Attribute" in das Ergebnis einbezogen / ausgeschlossen werden können - im konkreten Fall interessieren nur Dateien, aber keine "directories" = Ordner, deshalb das Minus.Mit "
2^>nul
" werden etwaige Fehlermeldungen (gemeint ist damit vorrangig Datei nicht gefunden) unterdrückt (genauer: ins "Nichts" umgeleitet). Würde anstelle von "2" keine Angabe oder "1" verwendet, hätte das zur Folge, dass die "normalen" Ausgaben / Meldungen (hier also die eigentlich benötigten Pfade zu den Dateien) "verschwinden" würden.Grüße
bastla
Hallo 00Snickers!
Kombiniert mit einem Stückchen Code, das ich (ähnlich) schon mal an anderer Stelle verbrochen hatte (und daher gleich mal ungetestet hier einbaue ), könnte das so aussehen:
Nach dem Motto "Nicht kleckern ..." gibt's die laufende Nummer gleich 3-stellig ...
Sicherung ist hier übrigens keine mehr enthalten - es wird gleich umbenannt (sonst ließen sich ja auch keine gleichnamigen Dateien im Ziel finden ) ...
Plan B wäre übrigens, einfach den gesamten Pfad (durch "Entnahme" der "\") zum Namen zu machen (das Ergebnis wäre aber ziemlich unübersichtlich) ...
Grüße
bastla
P.S.:
Kombiniert mit einem Stückchen Code, das ich (ähnlich) schon mal an anderer Stelle verbrochen hatte (und daher gleich mal ungetestet hier einbaue ), könnte das so aussehen:
@echo off & setlocal
set "Basis=D:\Daten"
for /d %%i in ("%Basis%\*.*") do (
pushd "%%i"
for /f "delims=" %%a in ('dir /s /b /a-d 2^>nul') do call :ProcessFile "%%a"
popd
)
goto :eof
:ProcessFile
set "N=%~nx1"
set Nr=1001
:Loop
if not exist "%N%" goto :DoIt
set /a Nr+=1
set "N=%~n1_%Nr:~-3%%~x1"
goto :Loop
:DoIt
move %1 "%N%"
goto :eof
Sicherung ist hier übrigens keine mehr enthalten - es wird gleich umbenannt (sonst ließen sich ja auch keine gleichnamigen Dateien im Ziel finden ) ...
Plan B wäre übrigens, einfach den gesamten Pfad (durch "Entnahme" der "\") zum Namen zu machen (das Ergebnis wäre aber ziemlich unübersichtlich) ...
Grüße
bastla
P.S.:
man möge mir meinen faux pas bitte verzeihen
Da bist Du nun wirklich nicht der Erste (was Du ja Bibers "running gag counter" entnehmen kannst) ...
Hallo 00Snickers!
Vorweg kurz zum Unterprogrammaufruf:
Der Teil ab "
Grüße
bastla
Vorweg kurz zum Unterprogrammaufruf:
Der Teil ab "
:ProcessFile
" ist im Prinzip ein eigener Batch - deshalb kommen die Aufrufparameter auch als %1, %2, etc an (und benötigen keine eigene Deklaration). Beim zweiten "goto :eof
" (entspricht einem "Return
" eines [alten] Basic) wird das Unterprogramm beendet und es erfolgt die Rückkehr zum aufrufenden "Hauptprogramm". Das erste "goto :eof
" sorgt schließlich für das Ende des Hauptprogrammes (damit nicht das Unterprogramm ein weiteres Mal durchlaufen wird).Befindet sich in dem ersten Unterordner bereits eine Datei, dann lässt er diese nicht einfach stehen, sondern benennt diese ebenfalls direkt mit "Dateiname" + "_" + "002" um.
Stimmt - das liegt daran, dass ab diesem Unterordner (U1) alle (also auch die bereits unmittelbar in U1 liegenden Dateien) erfasst werden und die Datei "mit sich selbst" kollidieren würde - Abhilfe kann hier nur eine weitere Schleife über alle unter U1 liegenden Ordner schaffen - das müsste dann (weiterhin ungetestet) als neue Zeile 6 (oder, bei Dir, 7) so aussehen:for /d %%u in (*.*) do for /f "delims=" %%a in ('dir /s /b /a-d "%%u" 2^>nul') do call :ProcessFile "%%a"
bastla