덮어 쓰지 않고 파일 복사


99

명령 줄에서 "디렉토리 A에서 디렉토리 B로 모든 파일을 복사합니다.하지만 파일이 디렉토리 B에 이미 존재한다면 어떤 파일이 더 최신인지에 상관없이 덮어 쓰지 마십시오."라고 말하는 방법을 찾을 수없는 것 같습니다. , 나에게 메시지를 표시하지 않습니다. "

나는 copy, move, xcopy & robocopy를 겪었고, 내가 얻을 수있는 가장 가까운 것은 robocopy에게 "A를 B로 복사하되 이전 파일로 최신 파일을 덮어 쓰지 마십시오"라고 말할 수 있다는 것입니다.하지만 그것은 저에게 효과가 없습니다. . xxcopy를 살펴 보았지만 다른 SVN 사용자가 빌드를 수행하기 위해 해당 도구를 설치해야하는 Visual Studio 빌드 후 이벤트에 대한 타사 종속성을 원하지 않기 때문에 삭제했습니다.

Visual Studio 2010의 빌드 후 이벤트에 명령 줄을 추가하여 새 EF 모델 개체에 대한 T4 템플릿 에서 생성 된 파일이 해당 파일이 속한 프로젝트 폴더에 배포되지만 기존 개체에 대한 파일이 다시 생성되도록하고 싶습니다. 잠재적으로 편집 된 대상 파일을 덮어 쓰지 마십시오.

T4 템플릿이 재생성되기 때문에 소스 파일은 항상 최신 상태이며 "newer"스위치를 안정적으로 사용할 수 없다고 생각합니다.

가능한 항목에 대해 부분 클래스를 사용하지만 부분 클래스를 사용할 수없는 다른 항목이 생성됩니다 (예 : 기본 EditorTemplate 또는 DisplayTemplate * .ascx 파일 생성).

비슷한 문제를 해결 한 사람이 있습니까?


cmd.exefor명령에 대해 잘 알고 있습니까? 그렇지 않은 경우 실행 for /?하여 사용하는 것이 좋습니다 .
Gabe

답변:


38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"

5
이것은 나를 위해 일했지만 명령 줄이 아닌 배치 파일 내에서 이것을 실행하기 때문에 하나 대신 두 개의 백분율 기호를 사용해야했습니다. % F 인스턴스를 %% F로, % ~ nxF 인스턴스를 %% ~ nxF로 교체했습니다.
Owen

1
무엇 않습니다 ~nx에에게 %~nxF정확히 말인가요?
Serge Rogatch

@stu ~nxF는 변수 F가 파일 이름과 확장자로 바뀐다 고만 말합니다 .
Serge Rogatch

예, 매우 효과적으로 경로없이 파일 이름 + 확장명을 제공하십시오. 이는 대상 폴더에서 테스트를 수행하고 대상 파일 이름을 지정하는 데 필요한 것입니다. 요점은 % F에 경로가 포함되어 있으므로 거기에 원하지 않는다는 것입니다.
Stu

207

ROBOCOPY , 또는 "강력한 파일 복사"명령 줄 디렉터리 복제 명령입니다. Windows NT 4.0부터 Windows Resource Kit의 일부로 제공되었으며 Windows Vista, Windows 7 및 Windows Server 2008의 표준 기능으로 도입되었습니다.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

자세히 설명하려면 (Hydrargyrum, HailGallaxar 및 Andy Schmidt 답변 사용) :

  • /E Robocopy는 빈 디렉터리를 포함하여 하위 디렉터리를 반복적으로 복사합니다.
  • /XC타임 스탬프는 같지만 파일 크기는 다른 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.
  • /XN대상 디렉토리의 복사본보다 새로운 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.
  • /XO대상 디렉토리의 사본보다 오래된 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.

Changed, Older 및 Newer 클래스를 제외하면 Robocopy는 스크립팅 환경을로드 할 필요없이 원본 포스터가 원하는대로 정확하게 수행합니다.

참조 : Technet , Wikipedia
다운로드 위치 : Microsoft 다운로드 링크 (링크는 2016 년 3 월 30 일에 마지막으로 확인 됨)


'제외'란 '건너 뛰기'또는 '삭제 / 제거'를 의미합니까?
공습

@Andre Terra : 일반적으로 건너 뜁니다. / MIR 플래그를 사용하는 경우 제거 될 수 있습니다. 나는 그것을 테스트하지 않았습니다.
Hydrargyrum

/ MIR을 사용하면 소스에없는 파일이 실제로 제거됩니다. 그러나 / XN 및 / XO를 함께 사용하는 경우 두 위치에있는 파일은 단순히 건너 뜁니다 (크기 확인 여부는 확실하지 않음). 이것은 내 응용 프로그램의 새 버전 또는 이전 버전을 복사해야하지만 응용 프로그램이 사용하는 라이브러리의 dateModified 스탬프가 올바르지 않지만 파일 이름 자체에 버전 번호가 포함 된 경우에 이상적입니다.
Henno Vermeulen 2015-08-05

포함 /e해야합니까? /s대신 사용하면 어떨까요? 빈 하위 폴더를 많이 원하지 않습니다.
Arete

48

벨리 사리우스의 해결책이 좋습니다.

약간 간결한 대답에 대해 자세히 설명하려면 다음을 수행하십시오.

  • /E Robocopy는 빈 디렉터리를 포함하여 하위 디렉터리를 반복적으로 복사합니다.
  • /XC타임 스탬프는 같지만 파일 크기는 다른 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.
  • /XN소스 디렉토리의 사본보다 새로운 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.
  • /XO소스 디렉토리의 사본보다 오래된 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.

Changed, Older 및 Newer 클래스를 제외하면 Robocopy는 스크립팅 환경을로드 할 필요없이 원본 포스터가 원하는대로 정확하게 수행합니다.


46

이것을 시도 할 수 있습니다.

echo n | copy /-y <SOURCE> <DESTINATION>

-y덮어 쓰기 전에 프롬프트를 표시하고 n을 이러한 모든 질문에 파이프 할 수 있습니다. 따라서 이것은 본질적으로 존재하지 않는 파일을 복사합니다. :)


2
매우 간단합니다.
Holf

6
한 번만 파이프 할 때 왜 모든 질문에 대답합니까?
phuclv

이 옵션을 선택했습니다. 파이핑을 생각하기 전에 누락 된 것으로 생각되는 매개 변수를 검색 한 후이 페이지를 발견했습니다. 이 솔루션을 시도해 보면 복사시 / Y 매개 변수가 분명히 활성화된다는 것을 알았습니다. 그래서 / -Y를 추가해야합니다.
Andrew

2
@phuclv copy /-ystdin의 입력이 부족하면 자동으로 No라고 가정합니다. 첫 번째 명시 적을 생략 n하거나 여기에 파이프 < nul할 수 있으며 동일한 일이 발생합니다.
mwfearnley

6

다음은 배치 파일 형식입니다.

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"

3

나는 내 자신의 테스트에서 무언가를 명확히하고 싶습니다.

@Hydrargyrum은 다음과 같이 썼습니다.

  • / XN은 원본 디렉터리의 복사본보다 새로운 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.
  • / XO는 원본 디렉터리의 복사본보다 오래된 기존 파일을 제외합니다. Robocopy는 일반적으로이를 덮어 씁니다.

이것은 실제로 거꾸로입니다. XN은 "최신 파일 제외"를 수행하지만 대상 디렉토리 의 사본보다 최신 파일은 제외합니다 . XO는 "이전 항목 제외"를 수행하지만 대상 디렉토리 의 복사본보다 오래된 파일은 제외합니다 .

물론 항상 자신의 테스트를 수행하십시오.


1
원래 질문에 대한 답변입니까, 아니면 다른 사람의 답변에 대한 의견입니까?
ASGM

1
Hydrargyrum의 답변은 원래 질문에 대한 답변을 작성하는 시점에 +25 표를 얻었습니까, 아니면 다른 사람의 답변에 대한 의견입니까?
월.

3

xcopy로이 작업을 수행하는 이상한 방법이 있습니다.

echo nnnnnnnnnnn | xcopy /-y source target

복사하는 파일만큼 n을 포함하면 모든 덮어 쓰기 질문에 n에 답합니다.


에 관해서 copy이 답변 , 특히 @mwfearnley 주석을 참조하십시오 : stdin이 소진되면 copy /-y자동으로 가정 n하므로 echo n한 번만 사용할 수 있으며 여전히 작동합니다.
rsenna

3
robocopy src dst /MIR /XX

/ XX : "eXtra"파일 및 디렉토리를 제외합니다 (대상에는 있지만 소스에는 없음). 이렇게하면 대상에서 삭제되지 않습니다. (기본값)


1

Robocopy는 아직 설치되지 않은 시스템의 경우 여기에서 다운로드 할 수 있습니다. (예 : Windows Server 2003)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (설치를 위해 재부팅 할 필요 없음)

robocopy exe에 대한 경로를 설정하는 것을 잊지 마십시오. "내 컴퓨터"> 속성> 고급> "환경 변수"를 마우스 오른쪽 단추로 클릭 한 다음 경로 시스템 변수를 찾아 끝에 "; C : \ Program Files \ Windows Resource Kits \ Tools"또는 사용자가있는 위치에 추가하면됩니다. 설치했습니다. 이미있는 경로 변수 문자열은 그대로두고 추가 경로 만 추가하십시오.

경로가 설정되면 belisarius가 제안하는 명령을 실행할 수 있습니다. 잘 작동합니다.


1

잘못된 메시지에 대해 직접 댓글을 달 수는 없지만 / XN 및 / XO 옵션의 정의가 이전 메시지에 게시 된 것과 비교하여 역전된다는 것을 모든 사람에게 경고하겠습니다.

Exclude Older / Newer files 옵션은 RoboCopy의 로깅에 표시된 정보와 일치합니다. RoboCopy는 SOURCE를 반복 한 다음 SOURCE의 각 파일이 대상에있는 파일보다 "OLDER"인지 "NEWER"인지보고합니다.

따라서 / XO는 여기에서 주장한 "원본보다 오래된"파일이 아니라 직관적 인 OLDER SOURCE 파일을 제외합니다.

새 원본 파일이나 변경된 원본 파일 만 복사하고 최신 대상 파일을 바꾸지 않으려면 / XO를 사용하는 것이 올바른 옵션입니다.


0

간단한 방법은 / MIR 옵션을 사용하여 두 디렉터리를 미러링하는 것입니다. 기본적으로 새 파일 만 대상에 복사합니다. 다음 명령에서 소스 및 대상을 폴더 경로로 바꾸면 스크립트는 확장자가있는 모든 파일을 검색합니다.

robocopy <source directory> <destination directory> *.* /MIR

0

이것이 나를 위해 일한 것입니다. 덮어 쓰지 않고 다른 드라이브에 파일을 "추가"하는 데 사용합니다.

배치 파일 : robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

예:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

구현하기 전에 테스트하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.