한 폴더의 파일을 해당 파일이 원래 있던 다른 여러 폴더로 복사합니다. 윈도우

한 폴더의 파일을 해당 파일이 원래 있던 다른 여러 폴더로 복사합니다. 윈도우

안녕하세요. 다음과 같은 문제가 있습니다.

다른 파일이 포함된 일부 Windows 폴더 구조가 있다고 가정합니다(모든 파일의 이름은 다르지만 확장자는 동일할 수 있음).

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

이제 모든 파일을 다른 디렉터리에 재귀적으로 복사합니다.

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

이제 제가 하고 싶은 일은 이 모든 파일을 원래 폴더에 다시 복사하고(이전 폴더와 파일은 그대로 남아 있으므로 방금 복사한 것입니다) 이전 파일을 덮어쓰는 것입니다. 실제로는 파일이 많기 때문에 수동으로 조작하는 것은 불가능합니다.

이를 수행할 수 있는 간단한 방법이 있습니까? 아니면 이를 수행하기 위해 사용자 정의 프로그램/스크립트를 작성하는 것이 더 낫습니까?

답변1

나는 일반적으로 다음과 같은 일괄 솔루션을 선호합니다.

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

변수는 orig재귀적으로 반복하려는 최상위 폴더가 됩니다(즉, dirA예제 dirB블록에서 또는 폴더를 공유하는 경우 이름이 중복되지 않는다는 확신이 있는 한 원하는 만큼 높이까지 이동할 수 있습니다). . 변수 dir는 이전에 모든 파일을 복사한 폴더가 됩니다.

for /r루프를 통해모두디렉토리(즉 orig, 모든 하위 폴더) 에 루트가 있는 파일 각 반복마다 파일의 전체 경로와 확장자를 으로 설정한 %%A다음 루프 내에서 %%~nxA(파일 이름과 확장자로 축소된 파일)이 우리 dir위치에 있는지 확인합니다. 존재하는 경우 dir해당 위치에서 해당 파일을 자체적 으로 복사합니다 orig. 그게 다야. 확인하기 위해 로그 파일을 생성하려면 일반적으로 robocopy를 사용하여 루프의 모든 내용을 다음과 같은 텍스트 파일로 출력하도록 하는 것이 좋습니다.

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

\유일한 까다로운 차이점은 지연된 확장 을 활성화하여 %%~dpA.

답변2

당신이 하고 싶은 일은 불가능합니다. 새 위치에 있는 파일에는 더 이상 해당 파일의 출처에 대한 정보가 없습니다. 이는 스크립트가 모든 파일을 어디에 넣어야 하는지 알 수 있는 방법이 없다는 것을 의미합니다.

오래된 디렉토리 목록이 있는 경우 일부 스크립팅 언어를 사용하면 쉽게 수행할 수 있습니다.

답변3

이름별 중복이 없다고 보장하는 경우 다음과 같은 것을 사용하십시오.

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

답변4

해시테이블을 사용하여 경로를 조회하는 PowerShell 솔루션:

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

관련 정보