폴더를 복사하는 것은 별것 아닌 것처럼 보일 수 있지만, 숨겨진 파일, 심볼릭 링크 또는 스크립트에 유용한 날짜가 포함된 디렉토리일 경우에는 다릅니다. cp -r은 트리를 복사하지만, cp -a는 속성을 수정하지 않고 작업 폴더를 복제하는 데 보통 더 나은 선택입니다.
소스를 삭제하기 전에 복사본을 만들고, 그것을 확인하며 몇 개의 파일을 엽니다. 명령이 성공적으로 수행되었다고 해서 올바른 경로를 겨냥했다는 것은 아닙니다.

cp -r과 cp -a 중 선택하기
cp -r은 하위 폴더로 내려갑니다. 점으로 시작하는 항목은 해당 폴더 자체를 복사할 때 잘 포함됩니다. 반면에 숨겨진 파일도 포함하기를 원하신다면 *와 같은 글로빙을 피하십시오: 셸은 기본적으로 이를 무시합니다.
cp -a는 아카이브 모드를 활성화합니다. 가능한 한 권한, 소유자, 날짜, 심볼릭 링크 및 하드 링크를 보존합니다. 로컬 백업이나 디렉토리 마이그레이션을 위한 경우, 일반적으로 이 명령을 우선적으로 선택해야 합니다. 자신의 계정으로 설정할 수 없는 소유자를 유지해야 하는 경우, 높은 권한이 필요할 수 있습니다.
cp -a -- /srv/app/ /srv/app-copie/
--는 옵션과 경로를 구분합니다. 대시로 시작하는 파일이 옵션으로 해석되는 것을 방지합니다. 소스의 마지막 슬래시는 여기서 그 내용을 /srv/app-copie/로 복사한다는 의미입니다. 그 폴더가 이미 존재한다면, 계속하기 전에 얻어진 구조를 확인하십시오.
잘못된 폴더를 덮어쓰지 않도록 대상 준비하기
먼저 명확하게 이름이 지정된 대상을 만들고, 양쪽을 나열하십시오. 서버에서 수동으로 작성된 경로로 재귀 복사를 시작하지 마십시오. 이 경로를 로그에 표시하는 것을 잊지 마십시오.
mkdir -p -- /srv/app-copie
find /srv/app -maxdepth 1 -printf '%fn' | sort
find /srv/app-copie -maxdepth 1 -printf '%fn' | sort
첫 시도 동안 모든 덮어쓰기를 거부하고 싶다면 -n을 추가하십시오. 이 옵션은 이미 존재하는 파일을 무시하므로, 전체 동기화에는 적합하지 않습니다. 기존 데이터를 대체하려면 백업을 하거나 새로운 디렉토리에서 작업한 후, 서비스가 검증된 복사본으로 전환하세요.
파일, 권한 및 링크 확인하기
숨겨진 파일과 권한을 먼저 확인하십시오. ls -la는 점으로 시작하는 이름을 표시합니다. stat는 민감한 파일의 권한과 날짜를 비교하는 데 사용할 수 있습니다.
ls -la /srv/app
ls -la /srv/app-copie
stat -c '%n %a %U:%G %y' /srv/app/config.ini /srv/app-copie/config.ini
find /srv/app-copie -type l -ls
마지막 명령은 심볼릭 링크를 나열합니다. cp -a를 사용하면 링크는 일반적으로 링크로 유지됩니다. 적합하지 않은 복사를 수행하게 되면, 링크의 대상 내용이 복사되거나 이동 후 링크가 잘못될 수 있습니다.
- 파일 수를 세는
find ... -type f | wc -l명령을 사용하십시오; - 가장 중요한 구성 파일을 여십시오;
- 소스를 삭제하기 전에 복사본에 대해 프로그램을 테스트하십시오;
- 서비스나 스크립트가 기능 검사를 통과할 때까지 소스를 유지하십시오.
두 트리의 내용을 비교하기 위해 diff -qr /srv/app /srv/app-copie는 다른 파일을 표시합니다. 이는 애플리케이션 검증을 대신하지는 않지만, 불완전한 복사를 빠르게 감지할 수 있습니다.
복제 후 권한을 수정해야 하는 경우, 리눅스의 재귀 chmod에 대한 가이드는 너무 빨리 실행된 chmod -R가 실행 파일을 망칠 수 있는 이유를 설명합니다. 복사 전에 파일을 찾으려면 리눅스의 find도 사용하십시오.