Copie archivos de una carpeta a varias otras carpetas de donde provienen originalmente estos archivos. ventanas

Copie archivos de una carpeta a varias otras carpetas de donde provienen originalmente estos archivos. ventanas

Hola, tengo el siguiente problema.

Supongamos que tiene una estructura de carpetas de Windows con diferentes archivos (todos los archivos tienen nombres diferentes pero pueden tener la misma extensión):

dirA
  subDirA
    file1.png
    file2.dds
  file3.jpeg
dirB
  subDirB
    subSubDirB
      file4.tiff
    some_txt.txt
  test.cfg
final.docx

Y ahora copias todos los archivos de forma recursiva a algún otro directorio:

file1.png
file2.dds
file3.jpeg
file4.tiff
some_txt.txt
test.cfg
final.docx

Y ahora lo que quiero hacer es copiar todos estos archivos nuevamente a sus carpetas originales (tenga en cuenta que las carpetas y archivos anteriores todavía están allí, simplemente los copié) y sobrescribir los archivos anteriores. En realidad hay muchos archivos por lo que no es una opción manipularlos manualmente.

¿Existe alguna forma sencilla de hacer esto o será mejor que escriba un programa/script personalizado para hacerlo?

Respuesta1

Normalmente preferiría una solución por lotes para algo como esto:

@echo off

set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"

for /r "%orig%" %%A in (*) do (
    if exist "%dir%\%%~nxA" copy /y "%dir%\%%~nxA" "%%A"
)

La origvariable será la carpeta superior por la que desea recorrer de forma recursiva (es decir, dirAdesde dirBsu bloque de ejemplo, o si comparten una carpeta, puede ir tan alto como desee, siempre y cuando esté seguro de que no habrá nombres duplicados). . La dirvariable será esa carpeta en la que previamente habías copiado todos los archivos.

for /rrecorretodoarchivos arraigados en un directorio (es decir, origy todas sus subcarpetas); para cada iteración establece la ruta completa y la extensión del archivo como %%A, luego dentro del bucle vemos si %%~nxA(el archivo reducido a su nombre y extensión) existe en nuestra dirubicación; si existe, copiamos ese archivo dirsobre sí mismo en la origubicación. Eso es todo. Si desea generar un archivo de registro para verificar, generalmente recomiendo usar robocopy y hacer que genere todo el bucle en un archivo de texto, que se vería así:

@echo off

set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"

setlocal enabledelayedexpansion
for /r "%orig%" %%A in (*) do (
    set "path=%%~dpA"
    if exist "%dir%\%%~nxA" robocopy "%dir%" "!path:~0,-1!" "%%~nxA"
)>>"%dir%\Return Files.txt"

La única diferencia complicada es habilitar la expansión retardada para que puedas recortar el final \del archivo %%~dpA.

Respuesta2

Lo que quieres hacer es imposible: los archivos en su nueva ubicación ya no tienen la información de dónde vinieron. Esto implica que no hay forma de que un script sepa dónde debe colocar cada archivo.

Si tiene una lista de directorio antigua, esto podría hacerse fácilmente con algún lenguaje de programación.

Respuesta3

Si garantiza que no hay duplicados de nombres, utilice algo como

forfiles /P X:\originals_folder /S /C "cmd /c copy Y:\copies_folder\@file @path\@file /Y"

Respuesta4

Una solución de PowerShell que utiliza una tabla hash para buscar rutas:

$originals = 'c:\originals'
$copies    = 'c:\copies'
$hash = @{}
gci $originals -recurse | %{
   $hash[$_.name] = $_.Fullname
}
gci $copies | %{copy-item $_ $hash[$_.Name] -force

información relacionada