cp는 copy의 약어로 파일이나 디렉토리를 복사할때 사용합니다. 보통 다음과 같이 사용 합니다.
[root@FC10VM /]# cp (디렉토리)copy1.txt (디렉토리)copy2.txt |
[그림 1. cp man_cp.txt파일을 man_cp2.txt파일로 복사]
간단하게 man_cp.txt파일을 man_cp2.txt파이로 복사 했습니다. 이번에는 디렉토리를 복사해 보도록 하겠습니다.
[그림 2. cp testDir디렉토리를 testDir2디렉토리로 복사]
그런대 문제가 발생합니다. 파일에 경우 cp로 복사가 되지만 디렉토리의 경우 복사가 되지 않습니다. 그렇기 때문에 에러 문구가(빨간 밑줄) 보입니다. 그럼 cp로 어떻게 복사를 하느냐? 옵션을 줘서 복사를 하게 됩니다. 디렉토리 복사시 "-r"옵션으로 가능하며 파일에 -r옵션을 사용했다면 이와 상관없이 명령이 실행됩니다. -R옵션으로 사용해도 문제가 발생되지는 않습니다. cp명령을 man명령으로 봤을때 -r, -R옵션에 대해 설명이 큰 차이를 나타내지는 않습니다.
하지만 문제는 복사 후에 발생하게 됩니다. 아무런 옵션 없이 복사를 하게 되면 파일, 디렉토리 모두 정보가 변경 됩니다. 이 정보는 소유자, 그룹, 권한 등이 포함됩니다. 민감한 시스템 파일일 경우 소유자에 따라서 실행이 되지 않을수도 있으니 문제가 발생하게 됩니다. 이런 문제를 해결하는 옵션이 "-p"옵션 입니다. -p옵션을 사용해 파일이나 디렉토리를 복사하게 되면 모든 정보가 그대로 복사 됩니다.
[그림 3. cp -p 옵션]
그림 3에서 보면 testDir2_r과 testDir3_rp디렉토리 둘다 동일한 testDir디렉토리를 복사했는대 차이가 있습니다. 마지막 수정시간의 시간 정보가 testDir2_r디렉토리는 복사가 된 시간이 보이지만 testDir3_rp디렉토리는 testDir디렉토리와 같은 시간이 보입니다.(빨간 밑줄과 노란 밑줄) 이는 위에서 언급한 바와 같이 -p옵션을 사용해 모든 정보가 동일하게 복사가 되었습니다. 파일 디렉토리 내에 파일 또한 동일한 옵션에 적용을 받습니다.(빨간 밑줄과 박스, 노란 밑줄과 박스)
[그림 4. cp -p 옵션에 디렉토리 내부 적용]
그외에 cp에서 사용 가능한 옵션을 설명 하겠습니다.
옵션 | 설명 |
-a (archive) | 원본 파일의 속성(Attribution)과 링크정보 등을 그대로 유지하면서 복사한다. -dpR 옵션과 같은 혁활을 한다. |
-b (backup) | 복사할 대상이 이미 있어(복사할 파일이 동일한 이름으로 해당 위치에 존재하고 있을 경우) 이것을 덮어쓰거나 지울 경우에 대히배 백업본을 만듬 |
-d (no dereference) | 만약 복사할 파일이 심블릭 파일이면 cp명령은 그 심블릭대상이 되는 파일을 복사한다. 때문에 이렇게 하지 않고 심블릭 파일 자체를 심블릭 정보와 함께 복사 할때 사용한다. |
-f (force) | 복사 대상 파일이 이미 있으면 강제로 지우고 복사한다. |
-i (interactive) | 복사 대상 파일이 이미 있으면 사용자에게 물어본다. |
-l (link) | 하드링크 형식으로 복사한다.(하드링크 형식이기 때문에 경로는 복사할 수 없다.) |
-P (parents) | 원본 파일이 디렉토리와 함께 지정되었을 경우 지정된 디렉토리를 그대로 복사한다. 이때 대상으로 사용될 수 있는 것은 디렉토리 이름이어야만 한다. 예를 들어 다음과 같이 명령어를 사용 한다면 "cp -P home/sysadmin/dir existing_dir" 결과는 existing_dir/home/sysadmin/dir 이런 식이 된다. |
-p (preserve) | 원본 파일의 소유주, 그룹, 권한, 시간정보 들이 그대로 보존되어 복사된다. |
-r | 일반 파일이 아니면, 그냥 복사되고, 디렉토리 라면 그 디렉토리와 함께 경로 안에 있는 모든 하위경로, 파일들이 복사 된다. |
-s (symbolic link) | 디렉토리가 아닌 일반 파일을 심블릭 링크 형식으로 복사한다. 이 때 복사할 원본 파일 이름은 절대경로('/'로 시작하는 경로)로 지정된 파일이름이어야 한다. 심블릭 링크를 지원하지 않는 시스템에서 이 옵션을 사용할 경우 오류 메시지를 보여준다. |
-u (update) | 복사할 대상이 파일 변경 날짜가 같거나 더 최근의 것이면 복사하지 않는다. |
-v (verbose) | 각 파일의 복사 상태를 자세히 보여준다. |
-x (one file system) | 원복과 대상 파일의 파일 시스템이 다를 경우에는 복사하지 않는다. |
-R (recursive) | 디렉토리를 복사할 경우에 그 안에 포함된 모든 하위디렉토리와 파일들을 모두 복사한다. |
-S (suffix backup suffix) | 복사 대상이 이미 있어 백업을 해야할 경우에 백업 파일에서 사용할 파일 이름의 꼬리 문자를 지정한다. 이것은 이미 지정되어 있는 SIMPLE_BACKUP_SUFFI 환경 변수를 무시하게 된다. 만약 이 환경변수도 지정되어 있지 않고 이 보션도 사용하지 않는다면 초기 값으로 Emacs와 같이 '~'문자를 사용한다. |
-V (version control) | 백업하는 방법을 지정하는데, 이미 지정되어 있는 VERISON_CONTROL환경 변수를 무시한다. 만약 이 환경 변수도 지정되어 있지 않고, 옵셩도 사용하지 않는다면 초기값으로 'existing'을 사용한다. 여기서 사용하는 백업방법은 GNU Emacs의 'version-control'값과 같다. -v {numbered, existing, simple} t 또는 numbered : 항상 번호 있는 백업본을 만든다. nil 또는 existing : 대상 파일이 이미 있을 경우에만 백업본을 만든다. never 또는 simple : 간단한 백업을 만든다. |