
안녕하세요. 다음과 같은 문제가 있습니다.
다른 파일이 포함된 일부 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