webentwicklung-frage-antwort-db.com.de

Wie kann ich den Inhalt eines Verzeichnisbaums in einen anderen verschieben?

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

C:\Source

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

C:\Destination

Bedarf:

  • Alle Dateien und alle Unterverzeichnisse innerhalb C:\SourceData müssen verschoben werden
  • Ich werde den Befehl in einer Batchdatei ausführen
  • Ich kann Powershell oder Keine anderen Skriptsprachen verwenden

Versuch 0

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

Das funktioniert einwandfrei, kopiert jedoch statt bewegt. Ich kann die Quelle nicht kopieren und löschen, da ich sehr viele Dateien verschiebe und nicht genügend Speicherplatz für zwei Kopien gleichzeitig vorhanden ist.

Versuch 1

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

Dadurch wird das gesamte C:\Source-Verzeichnis in C:\Destination verschoben, sodass ich am Ende mit:

C:\Destination\Source

Versuch 2

Mit etwas Hilfe von diese Frage und akzeptierte Antwort kam ich mit: 

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

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

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

Versuch 3

Wie von Nick D vorgeschlagen, versuchte ich es umzubenennen:

RENAME "C:\Source" Ziel

Für das Beispielszenario, das ich gegeben habe, funktioniert das gut. Leider befindet sich mein echtes Destination -Verzeichnis auf einer anderen Ebene als das Source -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 bekomme "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"
18
Tom Robinson

Update :

Code angepasst an a. Überprüfen Sie, ob am Zielordner bereits Ordner vorhanden sind. Verschieben Sie in diesem Fall die Dateien in diesem Ordner (und fahren Sie mit dem Durchlaufen der Quellverzeichnisstruktur fort). Andernfalls verschieben Sie den Ordner als Ganzes.

Am Ende des Skripts wird der Quellordner vollständig entfernt, um diese Ordner zu entfernen, deren Dateien in einen bereits vorhandenen Ordner am Zielort verschoben wurden (dh diese Ordner wurden geleert, jedoch 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 in der letzten Zeile des Skripts löschen). Wenn Sie dies nicht tun, wird die Syntax "Dateiname, Verzeichnisname oder Datenträgerbezeichnung falsch" angezeigt. Fehler.

Puh! Bitte lassen Sie mich wissen, wie es Ihnen geht! 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  
11
ljs

Verwenden Sie zweifellos Robocopy. Es ist ein einfaches, aber genial nützliches Werkzeug.

robocopy /move /e sourcedir destdir

Dadurch werden alle Dateien und Ordner, einschließlich leerer, verschoben, wobei jede Originaldatei gelöscht wird, nachdem sie verschoben wurde.

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

23
DavidMWilliams

Wie auf Twitter gesendet: Versuchen Sie, Versuch 3 mit Versuch zu kombinieren.

1
David Webster

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

1
StuperUser

unter Vista verwenden

 robocopy-Quellziel /MIR

/MIR .. spiegelt einen vollständigen Verzeichnisbaum (löscht auch Dateien im Ziel) 

else

 xcopy 

Natürlich muss man die Quelle danach löschen :)

1
Dynamicbyte
@echo on
set SOURCE=C:\Source
set DESTINATION=C:\Destination

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

PAUSE

ich benutze Batch-Datei wie diese ...

oder einfach anrufen:

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

Ich habe ein Verzeichnis, das .__ enthält. Dateien und eine Reihe von Ebenen von Unterverzeichnisse:

C:\Quelle

Ich möchte den Inhalt von .__ verschieben. C:\Quelle in:

C:\Ziel

Vielleicht fehlt mir etwas, aber können Sie den Ordner nicht einfach umbenennen?

1

Vielleicht ein wenig abseits, aber trotzdem nützlich:

Einige Leute schlagen vor, die Quelldateien einfach zu kopieren + löschen, aber das Verschieben von Dateien ist nicht gleichbedeutend mit dem Kopieren und Löschen!

Bei Verwendung der (x) copy -Funktion weisen Sie neuen Speicherplatz auf dem selben Datenträger auf einer Festplatte zu. Nach dem Kopieren der Dateien werden die Dateien old (der alte zugewiesene Speicherplatz, der für die Dateien benötigt wurde) als gelöscht markiert. Sie erzielen zwar dasselbe Ergebnis wie ein Endbenutzer, bewegen sich jedoch etwas anders und effizienter.

Beim Verschieben von -Dateien werden tatsächlich nur einige Datensätze in derMFT(Stammdatentabelle) geändert. Diese Änderungen bestehen nur aus einem anderen Pfad, damit der Benutzer seine Dateien finden kann. Physisch bleiben die Dateien immer noch in denselben Sektoren auf der Festplatte.

1
Fluxzoal

Als Antwort auf die Antwort von ufukgun:

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

/ s Kopiert Verzeichnisse und Unterverzeichnisse mit Ausnahme leerer Verzeichnisse.
/e - Kopiert Verzeichnisse und Unterverzeichnisse einschließlich leerer Verzeichnisse. Gleich wie/S/E. Kann verwendet werden, um/T zu ändern.
/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, zu bestätigen, dass Sie eine vorhandene Zieldatei überschreiben möchten.

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

1
axelitus

Wenn Sie lediglich versuchen, ein Verzeichnis und den Inhalt um eine Ebene zu verschieben:

MOVE folder_you_wan_to_move ..

Beachten Sie, dass .. auf das nächste Verzeichnis verweist.

0
Heber

Ich lasse diesen Code, den ich basierend auf ljs 'Versuch geschrieben habe, Er verschiebt Verzeichnisbäume wie Windows, überschreibt die Dateien, die bereits im Ziel vorhanden sind, mit denen im Quellcode und vermeidet die langsame Kopier- und Löschmethode, es sei denn, das Ziel befindet sich darin ein anderes Laufwerk.

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

movedir.bat source_dir ziel_dir

@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
0
marc r p

Ich denke, das einfachste, was Sie tun könnten, ist, Ihren Versuch 2 zu ändern

von

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

zu

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

KUSS ;-)

Edit : Dies scheint nicht zu funktionieren, also ist mein Rat, die beschissene DOS-Befehlszeile wegzuschneiden und Cygwin mit BASH als Shell zu verwenden! (oder fügen Sie einfach die cygwin-Binärdateien zum Pfad hinzu, sodass Sie mv innerhalb von DOS verwenden können, ohne die Shell als Anforderungsstatus ändern zu müssen).

0
fortran

Ich benutze ein Dienstprogramm namens xxcopy. Es kann Dateien verschieben und hat viele nützliche Optionen. Sie können es wie folgt verwenden:

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

die Optionen :

  • / E, um auch leere Ordner zu kopieren

  • / 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: http://www.xxcopy.com/xcpydnld.htm

0