web-dev-qa-db-fra.com

Comment puis-je déplacer le contenu d'une arborescence de répertoires dans une autre?

J'ai un répertoire qui contient des fichiers et un certain nombre de niveaux de sous-répertoires:

C:\Source

Je voudrais déplacer le contenu de C:\Source dans:

C:\Destination

Exigences:

  • Tous les fichiers et tous les sous-répertoires dans} C:\SourceData doit être déplacé
  • Je vais exécuter la commande dans un fichier batch
  • Je ne peux pas utiliser Powershell ou Aucun autre langage de script

Tentative 0

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

Cela fonctionne parfaitement, mais cela copie au lieu de se déplace. Je ne peux pas copier puis supprimer la source car je déplace un très grand nombre de fichiers et il n'y a pas assez d'espace disque pour en avoir deux copies à la fois.

Tentative 1

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

Cela déplace tout le répertoire C:\Source dans C:\Destination et je me retrouve donc avec:

C:\Destination\Source

Tentative 2

Avec l'aide de cette question et la réponse acceptée je suis venu avec: 

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

Cela déplace les fichiers dans C:\Source mais pas les sous-répertoires ni leur contenu. Notez que j'ai utilisé %% x au lieu de% x comme je l'utilise dans un fichier de commandes.

Utiliser FOR semble prometteur mais je ne suis pas sûr d'avoir utilisé la bonne syntaxe? Ai-je raté quelque chose?

Tentative 3

Comme suggéré par Nick D, j'ai essayé de renommer:

RENOMMER "C:\Source" Destination

Pour l'exemple de scénario que j'ai donné, cela fonctionne bien. Malheureusement, mon vrai répertoire Destination est à un niveau différent du répertoire Source et cela ne semble pas être pris en charge:

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.

J'obtiens "La syntaxe de la commande est incorrecte." erreurs si j'essaie de spécifier un chemin de destination plus complexe, par exemple:

RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
RENAME "C:\Source" "MyOtherDirectory\Destination"
18
Tom Robinson

Mettre à jour :

Code ajusté à a. vérifiez si des dossiers existent déjà sur la destination, auquel cas déplacer les fichiers de ce dossier (et continuer à parcourir la structure de répertoires source), sinon, déplacez le dossier en gros.

À la fin du script, le dossier source est complètement supprimé pour éliminer les dossiers dont les fichiers ont été déplacés vers un dossier existant de la destination (ce qui signifie que ces dossiers ont été vidés mais pas supprimés à la source).

De plus, nous vérifions si un dossier est à la fois vide et existe déjà à la destination, auquel cas nous ne faisons rien (et laissons le dossier source à supprimer jusqu'à la dernière ligne du script). Si vous ne le faites pas, "le nom du fichier, le nom du répertoire ou la syntaxe de l'étiquette du volume est incorrect". les erreurs.

Phew! S'il vous plaît laissez-moi savoir comment vous vous en sortez! J'ai testé cela et cela semble bien fonctionner.

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

Sans doute utiliser robocopy. C'est un outil simple mais brillamment utile.

robocopy /move /e sourcedir destdir

Cela déplacera tous les fichiers et dossiers, y compris ceux vides, en supprimant chaque fichier original après l'avoir déplacé.

Si vous n'avez pas installé Robocopy, vous pouvez le télécharger seul ou dans le cadre d'un kit de ressources Microsoft.

23
DavidMWilliams

Comme envoyé sur Twitter: Essayez de combiner la tentative 3 avec la tentative 1. Renommez pour obtenir le dossier de destination correct, puis déplacez "Destination" au bon endroit.

1
David Webster

Puisque XCOPY fonctionne, vous pouvez utiliser XCOPY et DELETE, c’est une solution de contournement, mais devrait-il fonctionner?

1
StuperUser

sous Vista

 robocopy la destination source /MIR

/MIR .. reflète une arborescence de répertoires complète (supprime également les fichiers de la destination).

else

 xcopy 

Bien sûr, vous devez supprimer la source après :)

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

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

PAUSE

j'utilise un fichier de commandes comme ça ...

ou appelez simplement:

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

J'ai un répertoire qui contient fichiers et un certain nombre de niveaux de sous-répertoires:

C:\Source

Je voudrais déplacer le contenu de C:\Source dans:

C:\Destination

Peut-être qu'il me manque quelque chose, mais vous ne pouvez pas simplement renommer le dossier?

1
Nick Dandoulakis

Peut-être un peu hors sujet, mais toujours utile:

Certaines personnes suggèrent simplement de copier + supprimer les fichiers sources, mais Déplacer des fichiers n’est pas la même chose que copier/supprimer!

Lorsque vous utilisez la fonction (x) copy} _ _, vous allouez un nouvel espace sur le même volume sur un disque dur. Après la copie des fichiers, les fichiers old (l'ancien espace alloué requis pour les fichiers) sont marqués de la manière suivante: supprimé. Bien que vous obteniez le même résultat qu'un utilisateur final, le fait de déménager a un effet différent et plus efficace.

Les fichiers en mouvement ne modifient en réalité que certains enregistrements de la table MFT (fichier maître). Ces modifications consistent uniquement en un chemin différent permettant à l'utilisateur de localiser ses fichiers. Physiquement, les fichiers restent dans les mêmes secteurs sur le disque dur.

1
Fluxzoal

En réponse à la réponse de ufukgun:

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

/ s - Copie les répertoires et les sous-répertoires, à l'exception des répertoires vides.
/e - Copie les répertoires et sous-répertoires, y compris les répertoires vides. Identique à/S/E. Peut être utilisé pour modifier/T.
/i - Si la destination n'existe pas et que vous copiez plus d'un fichier, supposez que cette destination doit être un répertoire.
/y - Supprime l'invite pour confirmer que vous souhaitez écraser un fichier de destination existant.

Comme indiqué dans une autre réponse, l’utilisation de xcopy n’est peut-être pas aussi efficace qu’il s’agirait d’une commande de déplacement native ne modifiant que les pointeurs du système de fichiers.

1
axelitus

Si tout ce que vous essayez de faire est de déplacer un répertoire et le contenu d’un niveau supérieur:

MOVE folder_you_wan_to_move ..

Notez que .. fait référence au répertoire suivant.

0
Heber

Je laisse ce code que j'ai écrit en fonction de la tentative de ljs, Il déplace les arborescences de répertoires comme Windows, en remplaçant les fichiers existants dans la destination par ceux de la source et en évitant la méthode de copie lente et d'effacement, sauf si la destination est dans un lecteur différent.

Si votre S.O n'est pas en anglais, vous devez modifier la ligne 6 avec le texte utilisé par la commande Dir lorsqu'il trouve 0 fichier.

moveir.bat rép_source rép_destination

@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

Je pense que la meilleure chose à faire est de modifier votre tentative 2

de

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

à

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

KISS ;-)

Edit : cela ne semble pas fonctionner, mon conseil est donc de supprimer la ligne de commande DOS pourrie et d'utiliser Cygwin avec BASH en tant que Shell! (ou ajoutez simplement les fichiers binaires cygwin au chemin afin que vous puissiez utiliser mv sous DOS, vous évitant ainsi de modifier le shell dans l'état de vos besoins).

0
fortran

J'utilise un utilitaire appelé xxcopy. Il peut déplacer des fichiers et avoir de nombreuses options utiles, vous pouvez l'utiliser comme ceci:

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

les options :

  • / E pour tout copier même les dossiers vides

  • / RC pour supprimer chaque fichier source après chaque copie réussie

vous pouvez télécharger une copie gratuite de xxcopy pour votre usage personnel à partir de: http://www.xxcopy.com/xcpydnld.htm

0
Abdulkarim Hamad