Dateien aus Unterverzeichnissen verschieben
Trotz einiger gefundener Hinweise komme ich nicht klar
Hallo zusammen,
ich habe ein übergeordnetes Verzeichnis A, in dem sich untergeordnete Verzeichnisse B bis Z befinden. In jedem der untergeordneten Verzeichnisse befinden sich eine oder mehrere Dateien.
Ich möchte eine Batch-Datei erstellen, mit deren Hilfe ich alle Dateien aus den Unterverzeichnissen B bis Z in das übergeordnete Verzeichnis A verschieben kann. Idealerweise sollen die Unterverzeichnisse anschließend gelöscht werden.
Habe versucht, eine Batch-Datei zu erstellen, wie es hier von Biber beschrieben ist:
Per Batch dateien aus Unterordner in den Hauptordner verschieben
Wenn ich dann die Datei ausführe, kriege ich die Fehlermeldung "Das System kann den angegebenen Pfad nicht finden". Wahrscheinlich ist der Dateiname von mir nicht korrekt angegeben worden (etwas mit der Syntax?).
Wäre froh, wenn jemand mir als einem blutigem Anfänger den Vorgang Schritt für Schritt erklären könnte.
P.S. Spielt es eine Rolle, wenn Dateinamen Leerzeichen haben?
Hallo zusammen,
ich habe ein übergeordnetes Verzeichnis A, in dem sich untergeordnete Verzeichnisse B bis Z befinden. In jedem der untergeordneten Verzeichnisse befinden sich eine oder mehrere Dateien.
Ich möchte eine Batch-Datei erstellen, mit deren Hilfe ich alle Dateien aus den Unterverzeichnissen B bis Z in das übergeordnete Verzeichnis A verschieben kann. Idealerweise sollen die Unterverzeichnisse anschließend gelöscht werden.
Habe versucht, eine Batch-Datei zu erstellen, wie es hier von Biber beschrieben ist:
Per Batch dateien aus Unterordner in den Hauptordner verschieben
Wenn ich dann die Datei ausführe, kriege ich die Fehlermeldung "Das System kann den angegebenen Pfad nicht finden". Wahrscheinlich ist der Dateiname von mir nicht korrekt angegeben worden (etwas mit der Syntax?).
Wäre froh, wenn jemand mir als einem blutigem Anfänger den Vorgang Schritt für Schritt erklären könnte.
P.S. Spielt es eine Rolle, wenn Dateinamen Leerzeichen haben?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 62736
Url: https://administrator.de/forum/dateien-aus-unterverzeichnissen-verschieben-62736.html
Ausgedruckt am: 09.04.2025 um 10:04 Uhr
12 Kommentare
Neuester Kommentar
Hallo JamesBond8811 und willkommen im Forum!
Deine Aufgabe ist aber trotzdem über den Explorer zu lösen, indem Du vom Ordner A aus eine "Suche" nach allen Dateien (also ohne etwa Teile des Dateinamens oder -inhaltes anzugeben ) durchführst, das Ergebnis nach der Spalte "Im Ordner" sortierst, die in den Unterordnern gefundenen Dateien markierst, ausschneidest und in den Ordner A einfügst. Das Löschen der Unterordner müsste dann gleichfalls "von Hand" erfolgen.
Da Du aber nach einer Batch-Lösung gefragt hast, ein Vorschlag, den Du unmittelbar an der Kommandozeile verwenden kannst:
Das D:\A entspricht Deinem angegebenen Beispielsverzeichnis A und muss natürlich entsprechend geändert werden. Falls Du die Zeile nicht am Prompt, sondern tatsächlich als Batch verwenden willst, ist jedes %i durch ein %%i zu ersetzen.
Vorweg eine Warnung: Diese Zeile wird Dateien verschieben und Verzeichnisse löschen, also zuerst auf Testdaten oder eine Kopie anwenden!
Zwei Anmerkungen:
Wie immer beim Verschieben/Kopieren von Dateien musst Du vorweg überlegen, was passieren soll, wenn eine Datei gleichen Namens bereits im Zielverzeichnis vorhanden ist. Der "move"-Befehl (zum Verschieben) fragt Dich in diesem Fall (aus Sicherheitsgründen verwende ich den Schalter "/-y") jeweils, ob einmal (diese Datei), diesmal nicht oder immer (bei diesem "move", also für dieses Verzeichnis) überschrieben werden soll.
Es werden auch wunschgemäß die "leeren" Verzeichnisse gelöscht, wobei ich "leer" so definiere, dass weder das Verzeichnis selbst, noch eines seiner Unterverzeichnisse (falls überhaupt vorhanden) noch eine Datei enthält - dann wird allerdings ohne Rückfrage das Verzeichnis inklusive aller Unterverzeichnisse entfernt.
Informationen zu den verwendeten Befehlen erhältst Du, indem Du zB "for /?" oder "help for" eingibst.
Erklärungsbedürftig könnte der zweite Teil der Zeile (nach dem "&", mit dem man mehrere Befehle verknüpfen kann) sein:
Um festzustellen, ob ein Verzeichnis oder dessen Unterverzeichnisse Dateien enthalten, wird der "dir"-Befehl mit den Schaltern "/s" (durchsuche auch Unterverzeichnisse) und "/a-d" (berücksichtige dabei aber nur Dateien) verwendet.
Da nur das Gesamtergebnis interessiert, wird die Ausgabe der gefundenen Dateien (mit ">nul") und die Fehlermeldung, wenn ein Verzeichnis keine Dateien enthält (mit "2>nul") ins "Nichts" umgeleitet.
Falls tatsächlich keine Dateien gefunden wurden, wird der "dir"-Befehl selbst mit einem Fehlercode ("Errorlevel") von 1 beendet.
Abschließend noch zu Deiner Frage nach den Leerstellen in Dateinamen: Das Leerzeichen wird als Trennzeichen interpretiert und würde einen Datei- (und natürlich auch Verzeichnis-) Namen "zerschneiden". Um das zu verhindern, müssen solche Namen (oder ganze Pfade, in denen zumindest eine Leerstelle enthalten ist) in Anführungszeichen eingeschlossen werden. Bei dem oben als Beispiel verwendeten Verzeichnis "D:\A" wäre dies zwar nicht erforderlich, da es aber auch nicht schadet, setze ich die Anführungszeichen mittlerweile schon gewohnheitsmäßig.
Grüße
bastla
Deine Aufgabe ist aber trotzdem über den Explorer zu lösen, indem Du vom Ordner A aus eine "Suche" nach allen Dateien (also ohne etwa Teile des Dateinamens oder -inhaltes anzugeben ) durchführst, das Ergebnis nach der Spalte "Im Ordner" sortierst, die in den Unterordnern gefundenen Dateien markierst, ausschneidest und in den Ordner A einfügst. Das Löschen der Unterordner müsste dann gleichfalls "von Hand" erfolgen.
Da Du aber nach einer Batch-Lösung gefragt hast, ein Vorschlag, den Du unmittelbar an der Kommandozeile verwenden kannst:
for /d %i in ("D:\A\*.*") do @move /-y "%i\*.*" "D:\A" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"
Vorweg eine Warnung: Diese Zeile wird Dateien verschieben und Verzeichnisse löschen, also zuerst auf Testdaten oder eine Kopie anwenden!
Zwei Anmerkungen:
Wie immer beim Verschieben/Kopieren von Dateien musst Du vorweg überlegen, was passieren soll, wenn eine Datei gleichen Namens bereits im Zielverzeichnis vorhanden ist. Der "move"-Befehl (zum Verschieben) fragt Dich in diesem Fall (aus Sicherheitsgründen verwende ich den Schalter "/-y") jeweils, ob einmal (diese Datei), diesmal nicht oder immer (bei diesem "move", also für dieses Verzeichnis) überschrieben werden soll.
Es werden auch wunschgemäß die "leeren" Verzeichnisse gelöscht, wobei ich "leer" so definiere, dass weder das Verzeichnis selbst, noch eines seiner Unterverzeichnisse (falls überhaupt vorhanden) noch eine Datei enthält - dann wird allerdings ohne Rückfrage das Verzeichnis inklusive aller Unterverzeichnisse entfernt.
Informationen zu den verwendeten Befehlen erhältst Du, indem Du zB "for /?" oder "help for" eingibst.
Erklärungsbedürftig könnte der zweite Teil der Zeile (nach dem "&", mit dem man mehrere Befehle verknüpfen kann) sein:
Um festzustellen, ob ein Verzeichnis oder dessen Unterverzeichnisse Dateien enthalten, wird der "dir"-Befehl mit den Schaltern "/s" (durchsuche auch Unterverzeichnisse) und "/a-d" (berücksichtige dabei aber nur Dateien) verwendet.
Da nur das Gesamtergebnis interessiert, wird die Ausgabe der gefundenen Dateien (mit ">nul") und die Fehlermeldung, wenn ein Verzeichnis keine Dateien enthält (mit "2>nul") ins "Nichts" umgeleitet.
Falls tatsächlich keine Dateien gefunden wurden, wird der "dir"-Befehl selbst mit einem Fehlercode ("Errorlevel") von 1 beendet.
Abschließend noch zu Deiner Frage nach den Leerstellen in Dateinamen: Das Leerzeichen wird als Trennzeichen interpretiert und würde einen Datei- (und natürlich auch Verzeichnis-) Namen "zerschneiden". Um das zu verhindern, müssen solche Namen (oder ganze Pfade, in denen zumindest eine Leerstelle enthalten ist) in Anführungszeichen eingeschlossen werden. Bei dem oben als Beispiel verwendeten Verzeichnis "D:\A" wäre dies zwar nicht erforderlich, da es aber auch nicht schadet, setze ich die Anführungszeichen mittlerweile schon gewohnheitsmäßig.
Grüße
bastla
Ganz, ganz sorry, JamesBond8811,
ich hatte Deine Antwort erst eben gelesen.
Kann auch nicht mal sofort sagen, was bei Dir der Klemmer ist.
Ich habe eben noch mal folgenden Proof-of-Concept gemacht:
[Bei mir am CMD-Prompt im Verzeichnis D:\temp, sollte aber auch in "D:\A" fliegen]
(=20:17:46 D:\temp=)
>echo ttt>d:\temp\zwei\test.ttt
[in einem Unterverzeichnis meiner Arbeitsebene eine Datei mit der Endung "*.ttt" anlegen.]
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp
move "D:\temp\zwei\*.ttt" d:\temp
[Simulation des MOVEns]
(=20:18:02 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
Syntaxfehler.
(=20:18:22 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /y "%i\*.ttt" d:\temp
D:\temp\zwei\test.ttt
Wie Du siehst, war der doppelt gemoppelte Move-Schalter "/-y" das Problem.
Ein einfaches "/y" bringt eine um vielfaches effizientere Variante.
Grüße
Biber
ich hatte Deine Antwort erst eben gelesen.
Kann auch nicht mal sofort sagen, was bei Dir der Klemmer ist.
Ich habe eben noch mal folgenden Proof-of-Concept gemacht:
[Bei mir am CMD-Prompt im Verzeichnis D:\temp, sollte aber auch in "D:\A" fliegen]
(=20:17:46 D:\temp=)
>echo ttt>d:\temp\zwei\test.ttt
[in einem Unterverzeichnis meiner Arbeitsebene eine Datei mit der Endung "*.ttt" anlegen.]
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp
move "D:\temp\zwei\*.ttt" d:\temp
[Simulation des MOVEns]
(=20:18:02 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
Syntaxfehler.
(=20:18:22 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /y "%i\*.ttt" d:\temp
D:\temp\zwei\test.ttt
Wie Du siehst, war der doppelt gemoppelte Move-Schalter "/-y" das Problem.
Ein einfaches "/y" bringt eine um vielfaches effizientere Variante.
Grüße
Biber
@Biber
Das "move /-y" hatte ja ich verbrochen, allerdings aus gutem Grund:
Beim Testen vom Prompt wurde bei "move" ohne "/y", wie zu erwarten, nach dem Überschreiben vorhandener Dateien gefragt, bei Verwendung in einem Batch allerdings nicht - daher zur Vorsicht die explizite Formulierung "/-y", die bei mir auch funktioniert - sowohl im Batch als auch von der Kommandozeile.
Den Syntaxfehler aus Deinem Beispiel erhalte ich übrigens auch nicht:
Grüße
bastla
P.S.: Dateiversion der cmd.exe: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
Das "move /-y" hatte ja ich verbrochen, allerdings aus gutem Grund:
Beim Testen vom Prompt wurde bei "move" ohne "/y", wie zu erwarten, nach dem Überschreiben vorhandener Dateien gefragt, bei Verwendung in einem Batch allerdings nicht - daher zur Vorsicht die explizite Formulierung "/-y", die bei mir auch funktioniert - sowohl im Batch als auch von der Kommandozeile.
Den Syntaxfehler aus Deinem Beispiel erhalte ich übrigens auch nicht:
<D:\temp>echo ttt>d:\temp\zwei\test.ttt
<D:\temp>for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp
move /-y "D:\temp\zwei\*.ttt" d:\temp
<D:\temp>for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
D:\temp\zwei\test.ttt
<D:\temp>dir /s /b
D:\temp\test.ttt
D:\temp\zwei
Grüße
bastla
P.S.: Dateiversion der cmd.exe: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
@bastla
Das ist in der Tat skurril...bei "nochm-Test" folgendes Verhalten:
>(=21:12:49 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
d:\temp\test.ttt überschreiben? (Ja/Nein/Alle):
Also "/-y" als doppelte Negation interpretiert????
Drex-Windows...*gg
Grüße
Biber
Das ist in der Tat skurril...bei "nochm-Test" folgendes Verhalten:
>(=21:12:49 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
d:\temp\test.ttt überschreiben? (Ja/Nein/Alle):
Also "/-y" als doppelte Negation interpretiert????
>filever /v %comspec%
--a-- W32i APP DEU 5.1.2600.2180 shp 401,408 08-04-2004 cmd.exe
Language 0x0407 (Deutsch (Deutschland))
CharSet 0x04b0 Unicode
OleSelfRegister Disabled
CompanyName Microsoft Corporation
FileDescription Windows-Befehlsprozessor
InternalName cmd
OriginalFilenam Cmd.Exe
ProductName Betriebssystem Microsoft« Windows«
ProductVersion 5.1.2600.2180
FileVersion 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
LegalCopyright ® Microsoft Corporation. Alle Rechte vorbehalten.
VS_FIXEDFILEINFO:
Signature: feef04bd
Struc Ver: 00010000
FileVer: 00050001:0a280884 (5.1:2600.2180)
ProdVer: 00050001:0a280884 (5.1:2600.2180)
FlagMask: 0000003f
Flags: 00000000
OS: 00040004 NT Win32
FileType: 00000001 App
SubType: 00000000
FileDate: 00000000:00000000
Drex-Windows...*gg
Grüße
Biber
@Biber
Aber das viel seltsamere ist das Verhalten in Batch - früher hatte ich das offensichtlich nie so genau getestet (bzw ohnehin "/y" verwendet), daher war ich über das kommentarlose Überschreiben auch ohne "/y" entsprechend erstaunt und habe dann zur "Sicherheitsvariante" gegriffen ...
Grüße
bastla
Also "/-y" als doppelte Negation interpretiert????
Eigentlich nur verneinte Bejahung (also: "auf keinen Fall ohne Rückfrage überschreiben") ...Aber das viel seltsamere ist das Verhalten in Batch - früher hatte ich das offensichtlich nie so genau getestet (bzw ohnehin "/y" verwendet), daher war ich über das kommentarlose Überschreiben auch ohne "/y" entsprechend erstaunt und habe dann zur "Sicherheitsvariante" gegriffen ...
Grüße
bastla
Ach sooooooo, bastla,
dann wird es eine gesetzte Umgebungsvariable COPYCMD bei Dir sein. Obwohl....?*grübel*
Es steht orakelhaft in COPY /? bzw. auch MOVE /?.
Die Option /Y ist in der COPYCMD-Umgebungsvariablen eventuell voreingestellt.
Dies kann durch die Option /-Y außer Kraft gesetzt werden. Standardmäßig
müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.
Die ist so grottig implementiert (wie auch %DIRCMD% btw), dass ich dazu mal fast ein Mini-Tut geschrieben hätte.
Spiel mal mit gesetzten %DIRCMD% und DIR-Parametern ein bisschen am Prompt herum, dann siehst Du, was ich meine...
Grüße
Biber
dann wird es eine gesetzte Umgebungsvariable COPYCMD bei Dir sein. Obwohl....?*grübel*
Es steht orakelhaft in COPY /? bzw. auch MOVE /?.
Die Option /Y ist in der COPYCMD-Umgebungsvariablen eventuell voreingestellt.
Dies kann durch die Option /-Y außer Kraft gesetzt werden. Standardmäßig
müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.
Die ist so grottig implementiert (wie auch %DIRCMD% btw), dass ich dazu mal fast ein Mini-Tut geschrieben hätte.
Spiel mal mit gesetzten %DIRCMD% und DIR-Parametern ein bisschen am Prompt herum, dann siehst Du, was ich meine...
Grüße
Biber
@Biber
Gar nicht nötig:
Standardmäßig müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.
Hätte ich jemals so weit gelesen, wäre mein Staunen unnötig gewesen - genau dieses Verhalten habe ich allerdings mit "/-y" auf "unbedingt vor dem Überschreiben nachfragen" abgeändert (insofern, um Dich zu zitieren, works as designed).
Konsequenz daraus: Bei der nächsten einschlägigen Batchdatei wieder 2 Zeichen eingespart ...
Da wäre dann eigentlich nur noch das Problem von JamesBond8811 ...
Vielleicht geht es ja wirklich ohne den Schalter besser, also (von der Kommandozeile):
Obwohl - so recht daran glauben kann ich eigentlich nicht ...
@JamesBond8811: Ich habe zum Testen das "@" vor dem "move" entfernt, damit die "move"-Befehle angezeigt werden - so kannst Du besser erkennen was abläuft (bzw wenn sich nix tut).
Grüße
bastla
P.S.: In solchen Situationen bedauere ich die fehlende Gelenkigkeit, um mir in den A.... beißen zu können.
Gar nicht nötig:
Standardmäßig müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.
Hätte ich jemals so weit gelesen, wäre mein Staunen unnötig gewesen - genau dieses Verhalten habe ich allerdings mit "/-y" auf "unbedingt vor dem Überschreiben nachfragen" abgeändert (insofern, um Dich zu zitieren, works as designed).
Konsequenz daraus: Bei der nächsten einschlägigen Batchdatei wieder 2 Zeichen eingespart ...
Da wäre dann eigentlich nur noch das Problem von JamesBond8811 ...
Vielleicht geht es ja wirklich ohne den Schalter besser, also (von der Kommandozeile):
for /d %i in ("D:\A\*.*") do move "%i\*.*" "D:\A\" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"
@JamesBond8811: Ich habe zum Testen das "@" vor dem "move" entfernt, damit die "move"-Befehle angezeigt werden - so kannst Du besser erkennen was abläuft (bzw wenn sich nix tut).
Grüße
bastla
P.S.: In solchen Situationen bedauere ich die fehlende Gelenkigkeit, um mir in den A.... beißen zu können.