Copie arquivos de uma pasta para várias outras pastas de onde esses arquivos vieram originalmente. janelas

Copie arquivos de uma pasta para várias outras pastas de onde esses arquivos vieram originalmente. janelas

Olá, estou com o seguinte problema

Suponha que você tenha alguma estrutura de pastas do Windows com arquivos diferentes (todos os arquivos têm nomes diferentes, mas podem ter a mesma extensão):

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

E agora você copia todos os arquivos recursivamente para algum outro diretório:

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

E agora o que eu quero fazer é copiar todos esses arquivos de volta para suas pastas originais (observe que as pastas e arquivos anteriores ainda estão lá, acabei de copiá-los) e sobrescrever os arquivos anteriores. Na realidade, existem muitos arquivos, então não é uma opção manipulá-los manualmente.

Existe alguma maneira simples de fazer isso ou é melhor escrever um programa/script personalizado para fazer isso?

Responder1

Eu normalmente preferiria uma solução em lote para algo assim:

@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"
)

A origvariável será a pasta superior pela qual você deseja percorrer recursivamente (ou seja, dirAou dirBdo seu bloco de exemplo - ou se eles compartilharem uma pasta, você pode ir tão alto quanto quiser, desde que tenha certeza de que não há nomes duplicados) . A dirvariável será a pasta para a qual você copiou todos os arquivos anteriormente.

for /rpercorretodosarquivos enraizados em um diretório (ou seja orig, todas as suas subpastas); para cada iteração ele define o caminho completo e a extensão do arquivo como %%A, então dentro do loop vemos se %%~nxA(o arquivo reduzido ao seu nome e extensão) existe em nossa dirlocalização; se existir, copiamos esse arquivo dirsobre ele mesmo no origlocal. É isso. Se você quiser gerar um arquivo de log para verificar, geralmente recomendo usar o robocopy e fazer com que ele produza tudo do loop em um arquivo de texto, que ficaria assim:

@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"

A única diferença complicada é ativar a expansão atrasada para que você possa cortar o final \do arquivo %%~dpA.

Responder2

O que você quer fazer é impossível: os arquivos em seu novo local não contêm mais as informações de onde vieram. Isso implica que não há como um script saber onde deve colocar cada arquivo.

Se você tiver uma listagem de diretório antiga, isso poderá ser feito facilmente com alguma linguagem de script.

Responder3

Se você garantir que não há nomes duplicados, use algo como

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

Responder4

Uma solução PowerShell, usando uma tabela hash para pesquisar caminhos:

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

informação relacionada