2011-12-31 22 views
7

Aquí hay un código que hice :)ROBOCOPY - Copiar el contenido de las carpetas en una sola carpeta

@echo off 
set source="R:\Contracts\" 
set destination="R:\Contracts\Sites\" 
ROBOCOPY %source% %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 /S 
for /r %source in (*) do @copy "%destination" . 

R: \ contratos \ está llena de carpetas que contienen archivos en ellos.

Quiero copiar todo a R: \ Contracts \ Sites \ y aplanar la estructura de carpetas.

Todo copia bien pero también la estructura de carpetas.

Gracias

+0

posible duplicado de [¿Cómo copiar archivos desde el árbol de la carpeta colocando todas las carpetas con Robocopy?] (Http://stackoverflow.com/questions/1502170/how-to-copy-files-from-folder-tree-dropping -all-the-folders-with-robocopy) –

Respuesta

9

No solo comando va a aplanar la jerarquía para usted; deberás usar múltiples comandos. Se puede hacer simplemente usando FOR/R para recorrer la jerarquía, junto con su comando de copiar/mover (move, copy, xcopy, robocopy). Como su destino se encuentra dentro de la jerarquía de origen, necesita un IF para evitar que el destino sea una fuente.

Antes de continuar, debe detenerse y pensar qué sucede si el mismo nombre de archivo aparece en varias carpetas de origen. Solo puede tener una versión en su carpeta de destino. ¿Puedes garantizar que no existen nombres duplicados? Si no, ¿qué archivo debe guardarse? ¿Cómo se puede estructurar el comando para mantener el archivo que desea? Esta complicación es probablemente la razón por la cual no se escribió ningún comando para simplemente aplanar una jerarquía.

Aquí está su comando ROBOCOPY integrado con la solución FOR/R.

@echo off 
set source="R:\Contracts" 
set destination="R:\Contracts\Sites" 

::Not sure if this is needed 
::It guarantees you have a canonical path (standard form) 
for %%F in (%destination%) do set destination="%%~fF" 

for /r %source% %%F in (.) do if "%%~fF" neq %destination% ROBOCOPY "%%F" %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 
+0

Hola dbenham, antes que nada, muchas gracias. He intentado con el código anterior, pero parece que no funciona. Hice un archivo por lotes y lo probé. He pasado por el código y no puedo ver ningún error directo. Por favor hagamelo saber. Gracias – Arthor

+0

Hola, eliminé esta línea "para %% F in (% destination%) do set destination ="% ~ fF "" y parece que funciona. Sin embargo, no estoy seguro si es necesario. Si gracias, gracias DBENHAM – Arthor

+0

Vaya, me faltaba un% cerca del final de esa línea. Está arreglado ahora. Su propósito era asegurarse de que la ruta estuviera representada en un formulario estándar completamente calificado para que la siguiente declaración IF funcione correctamente. – dbenham

0

recientemente he tenido que hacer frente a este problema, y ​​muchos archivos que quería moverse a partir de la jerarquía de una sola carpeta tenía el mismo nombre que uno al otro, y quería todavía aplanar la jerarquía sin ellos a siendo sobre escrito Lo que hice fue escribir un script que mueve el archivo, pero lo renombra con la antigua vía de jerarquía en nombre por ejemplo: archivos de origen:

C: \ archivos \ somefiles \ archivo.txt

C: \ archivos \ otherfiles \ archivo.txt

destino es C: \ newdir \ archivos se crean como

C: \ newdir \ somefiles-archivo.txt

C: \ newdir \ otherfiles-archivo.txt

aquí está el código, archivo por lotes 1 pasa a través de los archivos, archivo por lotes 2 renombra y ellos (se mueve también podría copiar en cambio, si se quiere conservar la fuente:

@echo off 
for /r %%f in (*.*pr) do @renameandmovefilespart2.bat "%%f" "%%~ff" "%%~xf" 

renameandmovefilespart2.bat

@echo off 
Setlocal EnableDelayedExpansion 
rem set the whole file path 
set origWhole=%1 
set origPathOnly=%2 
set extension=%3 
rem here you can set where the directory to hold the flattened hierarchy is 
set destDir=c:\destinationDir\ 
rem set the directory to do a string replace 
rem make this the starting directory, that you dont want in the newly renamed files 
set startingDir=C:\starting\directory\ 
set nothing= 
set slash=\ 
rem here you can set what the character to represent the directory indicator \ in the new files 
set reaplcementDirectoryCharacter=-- 
set quote=" 
rem cut out the starting part of the directory 
call set newname=%%origWhole:!startingDir!=!nothing!%% 
rem replace slashes with new character 
call set newname=%%newname:!slash!=!reaplcementDirectoryCharacter!%% 
rem remove quotes 
call set newname=%%newname:!quote!=!nothing!%% 
rem @echo shortened: %newname% 
rem @echo source path: %origPathOnly% newPath: %startingDir% 
rem @echo extension: %extension% 
rem rename the files 
ren %origWhole% %newname% 
rem prepare to move the file, clean up the source path 
call set origPathOnly=%%origPathOnly:!quote!=!nothing!%% 
move "%origPathOnly%%newname%" "%destDir%" 
7

Puede hacer eso con un forro PowerShell one. En este ejemplo, filtre todos los archivos con la extensión .txt de todas las subcarpetas. Y luego envíelos al Cmdlet Move-Item.

Combine los cmdlets get-Childitem (GCI para abreviar), -current, maby -filter y luego canalice el resultado al cmdlet Move-Item. Use -Qué pasa si primero verifica que el resultado sea el esperado.

Mover a la carpeta actual

get-Childitem -recurse -filter *.txt | Move-Item -WhatIf 

Mover a otra carpeta

get-Childitem -recurse -filter *.txt | Move-Item -Destination c:\temp -WhatIf 
+0

brillante. simple, fácil de entender – sonjz

0

Hay un viejo PC Magazine utilidad llamada Sweep.exe que pueden operar en el mismo comando de la corriente y subdirectorio. No pondría el destino como un subdirectorio del directorio fuente. Pon el destino en otro lugar.

http://www.rarewares.org/files/case/Sweep.zip

cd c:\contracts sweep copy *.* c:\sites

Esto copiará todo, desde c: \ contratos y por debajo de c: \ sitios

utilizo un comando similar para aplanar la jerarquía de un directorio.

Tenga cuidado con los duplicados y la forma en que desea manejarlos. ¿Desea sobrescribir o manejar de una manera diferente?

Cuestiones relacionadas