Frage an cmd, batch-file, windows – Wie kann ich den Inhalt eines Verzeichnisbaums in einen anderen verschieben?

18

Ich habe ein Verzeichnis, das Dateien und eine Reihe von Unterverzeichnissen enthält:

C:\Source

Ich möchte den Inhalt von C: \ Source in folgendes Verzeichnis verschieben:

C:\Destination

Bedarf:

Alle Dateien und alle Unterverzeichnisseinnerhalb C: \ SourceData muss verschoben werdenIch werde den Befehl in einer Batch-Datei ausführenIch kann weder Powershell noch andere Skriptsprachen verwenden

Versuch 0

XCOPY /E "C:\Source" "C:\Destination"

Dies funktioniert einwandfrei, aber es kopiert statt bewegt. Ich kann die Quelle nicht kopieren und dann löschen, da ich einen sehr großen Satz von Dateien verschiebe und nicht genügend Speicherplatz vorhanden ist, um zwei Kopien gleichzeitig zu haben.

Versuch 1

MOVE "C:\Source" "C:\Destination"

Dadurch wird das gesamte Verzeichnis C: \ Source verschobenin C: \ Destination, damit ich am Ende Folgendes erhalte:

C:\Destination\Source

Versuch 2

Mit etwas Hilfe vondiese Frage und akzeptierte Antwort Ich hatte die Idee dass:

for /r "C:\Source" %%x in (*) do move "%%x" "C:\Destination"

Dadurch werden die Dateien in C: \ Source verschoben, jedoch nicht die Unterverzeichnisse oder deren Inhalt. Beachten Sie, dass ich %% x anstelle von% x als Batchdatei verwendet habe.

Die Verwendung von FOR scheint vielversprechend, aber ich bin mir nicht sicher, ob ich die richtige Syntax verwendet habe? Habe ich etwas verpasst

Versuch 3

Wie von Nick D vorgeschlagen, habe ich versucht, umzubenennen:

RENAME "C: \ Source" Ziel

Für das Beispielszenario habe ich angegeben, dass dies gut funktioniert. Leider mein realZiel Das Verzeichnis befindet sich auf einer anderen Ebene als das VerzeichnisQuelle Verzeichnis und dies scheint nicht unterstützt zu werden:

C:\>REN /?
Renames a file or files.

RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.

Note that you cannot specify a new drive or path for your destination file.

Ich erhalte die Meldung "Die Syntax des Befehls ist falsch." Fehler, wenn ich versuche, einen komplexeren Zielpfad anzugeben, zum Beispiel:

RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
RENAME "C:\Source" "MyOtherDirectory\Destination"
Während MOVE die "Quelle" verschiebtin "Ziel" Wenn "Ziel" bereits vorhanden ist, wird "Quelle" verschoben.zu "Ziel", wenn es noch nicht existiert. Jason Musgrove
Wenn RENAME wie gewünscht funktioniert hat, hättest du in den richtigen Ordner mit einem temporären Namen wechseln und ihn dann umbenennen können :) eglasius

Deine Antwort

13   die antwort
1

das Dateien und eine Reihe von Unterverzeichnissen enthält:

C: \ Source

Ich möchte den Inhalt von C: \ Source in folgendes Verzeichnis verschieben:

C: \ Ziel

Vielleicht fehlt mir etwas, aber kannst du den Ordner nicht einfach umbenennen?

Leider scheint das nicht zu funktionieren, wenn das Zielverzeichnis nicht auf derselben Ebene wie das Quellverzeichnis liegt. Ich werde der Frage mehr Details hinzufügen als in diesem Kommentarfeld. Tom Robinson
0

ein Verzeichnis und den Inhalt um eine Ebene nach oben zu verschieben, gehen Sie wie folgt vor:

MOVE folder_you_wan_to_move ..

Beachten Sie, dass .. auf das nächsthöhere Verzeichnis verweist.

11

Aktualisieren:

Code auf a angepasst. Überprüfen Sie, ob am Zielort bereits Ordner vorhanden sind. Verschieben Sie in diesem Fall Dateien in diesen Ordner (und fahren Sie mit dem Durchsuchen der Quellverzeichnisstruktur fort), andernfalls verschieben Sie den Ordner in den Großhandel.

Am Ende des Skripts wird der Quellordner vollständig entfernt, um diese Ordner zu entfernen, deren Dateien in einen bereits vorhandenen Ordner am Ziel verschoben wurden (dh diese Ordner wurden geleert, aber nicht an der Quelle gelöscht).

Zusätzlich prüfen wir, ob ein Ordner leer ist und bereits am Ziel vorhanden ist. In diesem Fall tun wir nichts (und lassen den Quellordner bis zur letzten Zeile des Skripts gelöscht). Andernfalls ist die Syntax für Dateiname, Verzeichnisname oder Datenträgerbezeichnung falsch. fehler.

Puh! Bitte lassen Sie mich wissen, wie Sie damit umgehen! Ich habe das getestet und es scheint gut zu funktionieren.

for /d /r "c:\source" %%i in (*) do if exist "c:\destination\%%~ni" (dir "%%i" | find "0 File(s)" > NUL & if errorlevel 1 move /y "%%i\*.*" "c:\destination\%%~ni") else (move /y "%%i" "c:\destination")
move /y c:\source\*.* c:\destination
rd /s /q c:\source  
%%~ni Entfernt die Erweiterung, sodass ein Ordnername mit einem Punkt unterbrochen wird%%~nxi. Paul
Ich musste den FOR-Befehl ändern, um %% i anstelle von% i (wie in einer Batch-Datei) zu verwenden, aber ansonsten funktioniert es großartig. Vielen Dank! Tom Robinson
Yay! Das war wirklich eine Vermutung, um ehrlich zu sein. Bemerkte / D im Hilfebildschirm und machte eine Aufnahme ... Ich habe das %% i-Ding aktualisiert :) ljs
Hmm, vielleicht funktioniert es doch nicht. Ich erhalte die Meldung "Der Dateiname, der Verzeichnisname oder die Syntax der Datenträgerbezeichnung ist falsch." beim Ausführen des Befehls move. Tom Robinson
0

den ich aufgrund des Versuchs von ljs geschrieben habe, stehen. Er verschiebt Verzeichnisbäume wie Windows, überschreibt die bereits im Ziel vorhandenen Dateien mit denen im Quellverzeichnis und vermeidet die langsame Kopier- und Löschmethode, außer wenn sich das Ziel auf einem anderen Laufwerk befindet .

Wenn Ihr S.O nicht in Englisch ist, muss Zeile 6 mit dem Text geändert werden, der vom Befehl Dir verwendet wird, wenn 0 Dateien gefunden werden.

movedir.batQuellverzeichnis Zielverzeichnis

@echo off
SETLOCAL  ENABLEDELAYEDEXPANSION

if %1.==. echo movedir dir1[\*] dir2 & echo move dir1 inside dir2 overwriting coincident files & echo option \* moves only dir1 content & goto end

set S=%~f1
set D=%~f2
set "noFiles= 0 File"
set "R=0"         rem R is option [\*] flag

if %S:~-2%.==\.. set "S=%S:~,-2%" & set "R=1"

if not exist "%S%" goto paramERR
if not exist "%D%" goto paramERR

set "Trim=0" & set "Sc=%S%"
:LP
set /A Trim+=1 & (set "Sc=!Sc:~1!") & if NOT !Sc!.==. goto LP

if %R%==0 (if exist "%D%\%~n1%~x1" (set "D=%D%\%~n1%~x1")) else move /y "%S%" "%D%" & goto end

CALL:movefiles "%S%" "%D%"
for /D /R "%S%" %%I in (*) do (set "Way=%%~fI") & (set "Way=!Way:~%Trim%!") & if exist "%D%!Way!" (CALL:movefiles "%%I" "%D%!Way!") else (move /y "%%I" "%D%!Way!\.." > NUL)
rd /s/q "%S%" & if %R%==1 md "%S%"
goto end

:movefiles 
dir %1 | find "%noFiles%" > NUL & if ERRORLEVEL 1 move /y "%~1\*.*" %2 > NUL 
goto :eof

:paramERR
echo Source or Destination does not exist
:end
24

aber sehr nützliches Werkzeug.

robocopy /move /e sourcedir destdir

Dies verschiebt alle Dateien und Ordner, einschließlich der leeren, und löscht jede Originaldatei, nachdem sie verschoben wurde.

Wenn Sie Robocopy nicht installiert haben, können Sie es selbst oder als Teil eines Microsoft Resource Kits herunterladen.

+1: Ich hatte vergessen, dass sich die Robokopie bewegen kann (muss der Name sein!). In meinem Fall kann ich mich nicht darauf verlassen, dass Robocopy installiert ist, aber ich könnte die Binärdatei problemlos neben dem Skript einfügen. Tom Robinson
Es ist eine gute Antwort, aber es wird zuerst kopiert und dann gelöscht. Wenn Sie eine große Verzeichnisstruktur verschieben, dauert dies eine Weile. Das manuelle Verschieben im Explorer würde fast augenblicklich erfolgen, da lediglich die MFT aktualisiert werden müsste. Squashman
Ja - und das Schöne ist, dass es keine Abhängigkeiten gibt. Es ist nur eine EXE-Datei und funktioniert einwandfrei unter Vista, Server 2003, 2008 usw. Solange Sie sie mit dem Skript speichern können, verfügen Sie über einen robusten und zuverlässigen Prozess. DavidMWilliams
1
@echo on
set SOURCE=C:\Source
set DESTINATION=C:\Destination

xcopy %SOURCE%\* %DESTINATION%\* /s /e /i /Y

PAUSE

oder einfach anrufen:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y
Was machen diese / s / e / i / Y-Schalter? Verschieben sie die Dateien, anstatt sie zu kopieren? Tom Robinson
1

unter Vista verwenden

robocopy source destination /MIR

/MIR .. mirror a complete directory tree (also deletes files in the destination)

sonst

xcopy

Natürlich musst du die Quelle danach löschen :)

Ja es würde. Du würdest eine Robokopie brauchen / MOVE not / MIR Joey
Das würde in vielen Fällen funktionieren, aber leider kann ich die Quelle nicht kopieren und dann löschen, da ich einen sehr großen Satz von Dateien verschiebe und nicht genügend Speicherplatz vorhanden ist, um zwei Kopien gleichzeitig zu haben. Ich habe die Frage aktualisiert, um dies zu klären, ich hätte es vorher erwähnen sollen. Tom Robinson
1

Einige Leute empfehlen, nur die Quelldateien zu kopieren und zu löschen, aber das Verschieben von Dateien ist nicht dasselbe wie das Kopieren und Löschen!

Bei Verwendung der(x) kopieren Funktion, duneuen Raum zuweisen auf dergleiche Lautstärke auf einer Festplatte. Nach dem Kopieren der Dateien wird diealt Dateien (der alte zugewiesene Speicherplatz, der für die Dateien benötigt wurde) sind als gekennzeichnetgelöscht. Während Sie das gleiche Ergebnis wie ein Endbenutzer erzielen, bewirkt das Bewegen etwas anderes und effizienteres.

Ziehen um Dateien ändern tatsächlich nur einige Datensätze in derMFT (Hauptdateitabelle). Diese Änderungen bestehen nur aus einem anderen Pfad, über den der Benutzer seine Dateien finden kann. Physisch bleiben die Dateien immer noch in denselben Sektoren auf der Festplatte.

Wenn Sie xcopy oder Robocopy nicht verwenden, was würden Sie vorschlagen, um Ordner zu verschieben? oro777
1

Versuchen Sie, Versuch 3 mit Versuch 1 zu kombinieren. Umbenennen, um den Zielordner korrekt zu machen, und dann "Ziel" an die richtige Stelle verschieben.

0

das Einfachste, was Sie tun können, ist, Ihren Versuch 2 zu ändern

von

MOVE "C:\Source" "C:\Destination"

zu

MOVE "C:\Source\*" "C:\Destination"

KUSS ;-)

Bearbeiten: das scheint nicht zu funktionieren, also ist mein Rat, die beschissene DOS-Kommandozeile wegzuwerfen und Cygwin mit BASH als Shell zu benutzen! (oder fügen Sie einfach die Cygwin-Binärdateien zum Pfad hinzu, damit Sie sie verwenden könnenmv innerhalb von DOS, so dass Sie die Shell nicht entsprechend Ihren Anforderungen ändern müssen).

sind sie nicht? : -s was für ein Mist ... fortran
Das ist sehr einfach, funktioniert aber nicht. Unterverzeichnisse in C: \ Source werden nicht kopiert Tom Robinson
1

können Sie XCOPY und DELETE verwenden. Dies ist eine Problemumgehung, sollte aber funktionieren?

Das würde in vielen Fällen funktionieren, aber leider kann ich die Quelle nicht kopieren und dann löschen, da ich einen sehr großen Satz von Dateien verschiebe und nicht genügend Speicherplatz vorhanden ist, um zwei Kopien gleichzeitig zu haben. Ich habe die Frage aktualisiert, um dies zu klären, ich hätte es vorher erwähnen sollen. Tom Robinson
1

xcopy C:\Source\* C:\Destination\* /s /e /i /Y

/ s - Kopiert Verzeichnisse und Unterverzeichnisse, außer leere.
/ e - Kopiert Verzeichnisse und Unterverzeichnisse, einschließlich leerer. Gleich wie / S / E. Kann zum Modifizieren von / T verwendet werden.
/ i - Wenn das Ziel nicht vorhanden ist und mehr als eine Datei kopiert wird, wird davon ausgegangen, dass das Ziel ein Verzeichnis sein muss.
/ y - Unterdrückt die Aufforderung, das Überschreiben einer vorhandenen Zieldatei zu bestätigen.

Wie in einer anderen Antwort angegeben, ist die Verwendung von xcopy möglicherweise nicht so effizient wie ein nativer Befehl zum Verschieben, der nur die Zeiger im Dateisystem ändert.

0

ben und hat viele nützliche Optionen. Sie können es folgendermaßen verwenden:

xxcopy C:\Source C:\Destination /E /RC

die Optionen :

/ E, um alles zu kopieren, auch leere Ordner

/ RC, um jede Quelldatei nach jeder erfolgreichen Kopie zu entfernen

Sie können eine kostenlose Kopie von xxcopy für den persönlichen Gebrauch herunterladen von:http://www.xxcopy.com/xcpydnld.htm

Verwandte Fragen