[윈도우] ROBOCOPY로 디렉토리 단위 백업 자동화하기 - 디렉토리 복사와 미러링

Robocopy는 Windows 운영 체제에서 제공되는 명령 줄 파일/디렉토리 복사 도구로, 파일 및 디렉터리를 복사하는 데 사용합니다. 다양한 복사 옵션을 제공하며, 윈도우의 작업 스케줄러를 함께 사용하면 백업과 동기화를 자동으로 할 수 있습니다.

Robocopy를 사용하는 기본 명령어 및 옵션 표시 방법은 다음과 같습니다.

robocopy 원본경로 대상경로 [파일/폴더] [옵션]

[파일/폴더]는 복사할 원본 파일들을 필터링하는 옵션입니다.

[옵션] 항목은 다음 설명을 참조해서 필요한 옵션을 사용하면 됩니다. [옵션]을 미표시하면 원본경로 디렉토리 안의 파일들을 대상경로로 복사합니다. 중복 파일은 덮어쓰기 되며, 기본 상태에서는 대상경로에 누적 복사를 합니다. 하위 폴더는 별도 옵션을 표시하지 않으면 제외됩니다.

대상경로는 존재하는 디렉토리여야 합니다. 새로 대상 디렉토리를 만들어주지는 않습니다.

자주 사용하는 옵션들은 다음과 같습니다.

  • /E 또는 /S : 모든 하위 디렉터리 포함
  • /COPYALL : 모든 파일 속성 및 시간 정보를 그대로 복사
  • /R:n : 복사 실패 시 재시도 횟수 지정. 기본값은 1입니다.
  • /W:n : 재시도 간격 지정. 기본값은 30초입니다.
  • /L : 리스팅 모드. 실제로 파일을 복사하지는 않고, 원본과 대상을 비교해서 어떤 작업을 할 지 화면에 출력해서 확인만 합니다.
  • /MIR : 원본에서 삭제된 파일과 디렉토리를 대상에서도 제거합니다. 대상이 원본의 복사본을 그대로 유지하는 미러링 모드 옵션입니다.
  • /LOG:파일경로 : 로그 파일을 지정한 경로의 텍스트 파일로 생성. 자동화를 할 때 에러의 원인 파악에 도움이 되므로 사용하는 것을 추천합니다. 기본 설정으로 로그 파일을 매번 새로 생성해서 덮어씁니다. 누적해서 로그를 쌓으려면 /LOG+ 로"+"를 붙여서 누적 표시를 하면 됩니다.
    유니코드 파일로 로그를 저장하려면 /UNILOG 를 사용합니다.

실전 사용 방법

실제로 가장 많이 사용하는 Robocopy 예제를 기준으로 설명하겠습니다.

robocopy C:\원본폴더 Z:\대상폴더 /E /COPYALL /R:3 /W:5 /LOG:Z:\로그파일.txt
  • C:\원본폴더 : 복사할 원본 파일이나 원본 폴더 경로
  • D:\대상폴더 : 복사한 파일이나 폴더를 저장하는 경로
  • /E : 하위 디렉터리 포함 복사
  • /COPYALL : 원본의 파일 속성 및 시간 정보도 복사
  • /R : 실패시 재시도 횟수. 기본값은 1이며, R:3 은 최대 3회 재시도.
  • /W : 재시도 간격. 기본값은 30초이며 W:5 는 5초 간격으로 재시도.
  • /LOG : 로그파일 경로와 파일 이름 표시. Robocopy로 복사를 하는 파일 단위로 로그를 기록.

자주 사용하는 Robocopy 예제

지정한 디렉토리와 하위 디렉터리를 모두 복사

robocopy C:\원본폴더 Z:\대상폴더 /E

파일 및 하위 디렉터리 복사 + 로그 파일 생성

robocopy C:\원본폴더 Z:\대상폴더 /E /LOG:Z:\로그파일.txt

로그 파일을 누적 보관하려면 "/LOG+:Z:\로그파일.txt"로 옵션을 표시합니다. 파일을 누적 보관할 때는 로그 파일이 너무 커지지 않도록 주의해야 합니다. 복사되는 파일 단위로 로그가 기록되기 때문에, 장기간 누적될 경우 수백메가를 쉽게 넘어갑니다.

Robocopy로 복사를 하면서 기록하는 로그 내용은 다음과 같습니다.

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows용 견고한 파일 복사
-------------------------------------------------------------------------------

  시작됨: 2024년 2월 12일 월요일 오후 10:43:21
        원본 : c:\_DATA\aPOST\apost.dev\
        대상 : c:\test\apost.dev\

        파일 : *.*

        옵션 : *.* /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------

                           1    c:\_DATA\aPOST\apost.dev\
            새 파일                   58        ads.txt
100%

------------------------------------------------------------------------------

                  전체       복사됨      건너 뜀       불일치        실패        추가
    디렉터리 :         1         0         1         0         0         0
      파일 :         1         1         0         0         0         0
     바이트 :        58        58         0         0         0         0
      시간 :   0:00:00   0:00:00                       0:00:00   0:00:00


      속도 :              58,000 바이트/초
      속도 :               3.319 메가바이트/분
   종료됨: 2024년 2월 12일 월요일 오후 10:43:21

로그 파일로 저장하지 않으면 Robocopy 실행 로그 내용이 화면에 출력됩니다.

파일 및 디렉터리 복사 및 삭제된 원본의 항목을 대상에서 제거

robocopy C:\원본폴더 Z:\대상폴더 /MIR

미러 모드로 동작합니다. 완전한 복사본을 대상 폴더에 유지할 때 사용합니다. 원본에서 삭제된 파일은 대상 폴더에서도 삭제됩니다.

특정 확장자의 파일만 복사

robocopy C:\원본폴더 Z:\대상폴더 *.jpg

원본 폴더의 jpg 확장자를 가진 이미지 파일만 대상 폴더로 복사합니다.

대상 디렉토리의 파일과 원본 파일을 비교

robocopy C:\원본폴더 Z:\대상폴더 /L

대상 디렉토리와 원본 디렉토리를 비교해서 복사할 파일 목록을 화면에 출력만 합니다. 복사 처리가 된 것처럼 로그가 출력되지만 실제로 파일을 복사하거나 삭제하지는 않습니다.

복사할 대상 목록을 사전에 확인할 때 사용합니다.

작업 스케줄러로 robocopy 자동화 하기

robocopy 커맨드 라인 행을 배치파일로 저장합니다. 텍스트 편집기를 열어 robocopy 커맨드 라인 행을 입력한 후 확장자를 "bat"로 저장합니다.

작업 스케줄러를 실행한 후, 오른쪽의 "작업" 목록에서 "작업 만들기"를 눌러 새 작업 생성 창을 엽니다.

일반 탭 : 스케줄러 작업 이름을 입력합니다. 하단의 "사용자의 로그온 여부에 관계없이 실행"을 선택해서 항상 실행될 수 있도록 합니다.

트리거 탭 : "새로 만들기" 버튼을 눌러 robocopy 배치 파일을 실행할 주기를 지정합니다. 일 단위, 월 단위, 시간 단위 등 다양하게 설정할 수 있습니다.

동작 탭 : "새로 만들기" 버튼을 눌러 "찾아보기"로 작성한 배치파일을 선택합니다.

스케줄러 작업이 실행할 때마다 새 로그파일 만들기

/LOG+ 옵션으로 로그를 한 파일에 누적하면 반복 실행하는 스케줄러 작업의 로그를 모두 확인할 수 있지만, 파일이 지나치게 커지는 단점이 있습니다.

스캐줄러를 실행할 때마다 날짜/사간 기준으로 로그 파일명을 지정하면 로그 파일 관리가 훨씬 수월해집니다. 로그 파일을 구분해서 저장하면 오래되서 불필요한 로그 파일들을 삭제하면 디스크 공간도 절약할 수 있기 때문에 robocopy 작업을 자동화 할 때는 필수로 적용하는 것이 좋습니다.

앞서 생성한 robocopy 커맨드라인 배치 파일을 열서 robocopy 커맨드 라인 행 위에 다음 내용을 추가합니다. 전체 배치파일의 내용은 다음과 같습니다.

echo off
set CUR_HH=%time:~0,2%
if %CUR_HH% lss 10 (set CUR_HH=0%time:~1,1%)
set CUR_MIN=%time:~3,2%
set CUR_SEC=%time:~6,2%
 
set LOGFILENAME=%date%-%CUR_HH%%CUR_MIN%%CUR_SEC%

robocopy c:\_DATA\aPOST\apost.dev z:\backup\apost.dev /MIR /LOG:C:\backup\%LOGFILENAME%.log

그리고, robocopy 커맨드 라인 행의 로그 파일명을 추가한 변수 이름로 변경합니다.

robocopy 커맨드라인 행의 "%LOGFILENAME%"이 날짜를 기준으로 생성한 변수를 커맨드 라인 행에 대입하는 것입니다.

이제 작업 스케줄러로 robocopy 복사 작업이 실행될 때마다 새 로그 파일에 robocopy 로그 내용이 기록됩니다. 로그 파일은 "2024-02-13-00-3012.log"와 같은 형식으로 파일 이름이 배치파일 실행 시점의 년월일시분초를 기준으로 작성됩니다.