replace는 원본 디렉터리의 파일로 대상 디렉터리에 있는 같은 이름의 파일을 교체하거나, /a를 쓰면 대상에 없는 파일만 새로 추가하는 명령이다.
이 장을 읽기 전에
선행 챕터: 이 장은 24장: mklink에서 링크를 만드는 법을 다룬 뒤 이어지며, Part 2(파일과 디렉터리 조작)의 마지막 장이다. 14–17장(copy·xcopy·robocopy·move)이 “원본을 그대로 옮기거나 복사"하는 명령이었다면, replace는 “대상의 기존 상태를 조건부로 교체·보완"한다는 점에서 더 정교한 배포 시나리오에 쓰인다.
이 장의 깊이: 중급. 오래된 명령이라 최신 자동화에서는 robocopy로 대체되는 경우가 많지만, 레거시 배포 스크립트를 유지 보수할 때 여전히 마주칠 수 있다.
사용법
| |
두 문법이 나뉘어 있는 것은 /a와 /s·/u가 함께 쓰일 수 없기 때문이다.
옵션
| 옵션 | 설명 |
|---|---|
/a | 대상에 없는 파일만 추가(기존 파일 교체는 하지 않음). /s, /u와 함께 쓸 수 없음 |
/p | 각 파일을 교체·추가하기 전에 확인 |
/r | 읽기 전용 파일도 교체(지정하지 않으면 오류로 중단) |
/s | 대상 디렉터리의 하위 디렉터리까지 검색해 일치하는 파일 교체(원본 쪽 하위 디렉터리는 검색하지 않음). /a와 함께 쓸 수 없음 |
/u | 대상보다 원본이 더 최신인 파일만 갱신. /a와 함께 쓸 수 없음 |
/w | 원본 파일을 찾기 전에 디스크 삽입을 기다림 |
예시
| |
주의사항·함정
/a는 /s·/u와 함께 쓸 수 없다: Microsoft Learn은 이 상호배타 관계를 명시적으로 규정한다.
“You can’t use this command-line option with the /s or /u command-line option.” — Microsoft Learn, “replace”(
/a설명 중)
“없는 파일만 추가"하는 모드(/a)와 “하위 디렉터리까지 검색”·“최신 파일만 갱신"하는 모드(/s, /u)는 replace 안에서 서로 다른 두 가지 사용 방식으로 나뉘어 있어, 옵션을 섞어 쓰면 오류가 난다. 위 사용법 블록에 두 문법이 따로 적힌 이유가 여기에 있다.
읽기 전용 파일은 /r 없이 교체할 수 없다: 대상 파일이 읽기 전용이면 /r을 명시하지 않는 한 오류가 나고 그 파일의 교체가 중단된다. 21장(attrib)에서 다룬 읽기 전용 속성이 여기서도 그대로 영향을 준다.
숨김·시스템 파일은 갱신할 수 없다: Microsoft Learn은 replace로 숨김 파일이나 시스템 파일을 업데이트할 수 없다고 명시한다. 이런 파일을 교체 대상으로 삼으려면 attrib로 속성을 먼저 해제해야 한다.
종료 코드로 배치 스크립트에서 원인을 구분한다: replace는 세분화된 종료 코드를 반환한다.
| 종료 코드 | 의미 |
|---|---|
| 0 | 성공적으로 교체·추가함 |
| 2 | 원본 파일을 찾지 못함 |
| 3 | 원본 또는 대상 경로를 찾지 못함 |
| 5 | 접근 권한 없음 |
| 8 | 시스템 메모리 부족 |
| 11 | 명령줄 구문 오류 |
15장(xcopy)에서 이미 익힌 것처럼, 배치 파일에서 if errorlevel로 이 코드를 검사해 실패 유형별로 대응할 수 있다.
PowerShell에는 replace에 대응하는 단일 cmdlet이 없다: “교체만 하고 없으면 추가하지 않음”(기본 모드)과 “없는 파일만 추가”(/a)를 나누는 replace 특유의 의미론을 그대로 옮겨주는 cmdlet은 PowerShell에 없다. 같은 동작이 필요하다면 Test-Path로 대상 파일 존재 여부를 확인한 뒤 Copy-Item을 호출하는 스크립트를 직접 구성해야 하며, 실무에서는 이렇게 손으로 조합하기보다 파일 최신성 비교까지 이미 갖춘 robocopy(16장)를 그대로 쓰는 경우가 더 많다.
흔한 오개념
“옵션 없이 replace를 실행하면 대상에 없는 파일도 알아서 추가해준다”는 오해가 있다. 실제로는 정반대다. 옵션 없는 기본 동작은 “대상에 이미 존재하는 파일만 교체"이며, 대상에 없는 파일은 조용히 건너뛸 뿐 추가되지 않는다. 원본 디렉터리의 새 파일까지 대상에 채워 넣고 싶다면 반드시 /a를 명시해야 하고, 이때는 반대로 기존 파일 교체가 되지 않는다는 점(위 상호배타 규칙)도 함께 기억해야 한다.
다음 장에서는
다음은 26장 — 파일이나 출력에서 문자열을 찾는 find 명령으로 Part 3(텍스트 검색과 출력 제어)이 시작된다.
평가 기준
- replace로 기존 파일을 교체하는 것과
/a로 없는 파일만 추가하는 것의 차이를 설명할 수 있다. /a가/s·/u와 함께 쓰일 수 없는 이유를 설명할 수 있다.- 읽기 전용·숨김·시스템 파일을 replace로 다룰 때의 제약을 안다.
- replace의 종료 코드로 배치 스크립트에서 실패 원인을 구분할 수 있다.
![Featured image of post [CMD] 25. replace - 대상 디렉터리의 파일 교체](/post/cmd/replace-command-replace-files-windows-cmd/wordcloud_hu_6be50b75a7b8bb2c.webp)
![[CMD] 23. fc - 파일 줄 단위·바이트 단위 비교](/post/cmd/fc-command-compare-files-differences-windows-cmd/wordcloud_hu_a0802d5c5bbdf78c.webp)
![[CMD] 24. mklink - 심볼릭 링크와 하드 링크 생성](/post/cmd/mklink-command-symbolic-hard-links-windows-cmd/wordcloud_hu_18e8987f23c4bd60.webp)
![[CMD] 25. replace - 대상 디렉터리의 파일 교체](/post/cmd/replace-command-replace-files-windows-cmd/wordcloud_hu_2f099c28d64df98f.webp)
![[CMD] 26. find - 파일·출력에서 문자열 검색](/post/cmd/find-command-search-text-string-windows-cmd/wordcloud_hu_ffdd6b8587439005.webp)
![[CMD] 27. findstr - 정규식 지원 문자열 검색](/post/cmd/findstr-command-regex-search-windows-cmd/wordcloud_hu_efb17f24b058094b.webp)
![[CMD] 15. xcopy - 디렉터리 트리 복사](/post/cmd/xcopy-command-copy-directory-tree-windows-cmd/wordcloud_hu_7460ca7bce82ba7.webp)
![[CMD] 16. robocopy - 재시도와 미러링을 지원하는 고급 복사](/post/cmd/robocopy-command-mirror-copy-files-windows/wordcloud_hu_dd24aaa23520a776.webp)
![[CMD] 14. copy - 파일 복사](/post/cmd/copy-command-copy-files-windows-cmd/wordcloud_hu_ab1a3c6e36b23ca8.webp)
![[CMD] 22. comp - 파일 바이트 단위 비교](/post/cmd/comp-command-compare-files-byte-windows-cmd/wordcloud_hu_ec6eca2442ef7c9f.webp)