
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 orig
variável será a pasta superior pela qual você deseja percorrer recursivamente (ou seja, dirA
ou dirB
do 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 dir
variável será a pasta para a qual você copiou todos os arquivos anteriormente.
for /r
percorretodosarquivos 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 dir
localização; se existir, copiamos esse arquivo dir
sobre ele mesmo no orig
local. É 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