
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 orig
variable será la carpeta superior por la que desea recorrer de forma recursiva (es decir, dirA
desde dirB
su 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 dir
variable será esa carpeta en la que previamente habías copiado todos los archivos.
for /r
recorretodoarchivos arraigados en un directorio (es decir, orig
y 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 dir
ubicación; si existe, copiamos ese archivo dir
sobre sí mismo en la orig
ubicació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