리눅스 cp 디렉토리 덮어쓰기 - linugseu cp dilegtoli deop-eosseugi

  • ■ cp 명령어 – 파일시스템 명령어
    • 1. cp 명령어 옵션
    • 2. cp 명령어 일괄 덮어쓰기 설정 2가지 방법

cp 명령어는 Copy의 약자로 파일 및 디렉토리를 복사합니다.

기본 사용법은

log]#  cp messages messages_ori

간단하게 복사할 대상과 새로운 이름 등을 설정하여 사용할 수 있습니다.

리눅스 cp 디렉토리 덮어쓰기 - linugseu cp dilegtoli deop-eosseugi

cp 명령어를 실행할 때 같은 이름의 대상 파일이 있을 때는 사용자에게 묻지 않고 덮어쓰기가 되는데, 이를 방지하기 위해 Alias “cp=’cp -i”로 설정되어 있습니다.

1. cp 명령어 옵션

자주 사용하는 cp 명령어 옵션입니다.

cp 명령어 cp 옵션 copy의 약자로 파일이나 디렉토리 복사
~]#cp -ar / ~]# cp -aru [a],하위디렉토리파일모두[r],
~]#cp -a --archiv 원본 파일의 속성, 링크 정보들을 그대로 유지하면서 복사한다. (이하 파일도 적용)
~]#cp -b 복사할 대상이 이미 있을 경우 기존 파일을 백업하고 복사한다.
~]#cp -d 만약 복사할 원본이 심볼릭 링크일 때 심볼릭 자체를 복사한다.
~]#cp-f 만약 복사할 대상이 이미 있으면 강제로 지우고 복사한다.
~]#cp i --interactive 덮어쓰기를 할 것인지 묻는다.
~]#cp -l 하드링크 형식으로 복사한다.
~]#cp -P 원본 파일 지정을 경로와 같이했을 경우 그 경로 그대로 복사된다.
~]#cp -p 파일의 소유자, 그룹, 권한, 시간 정보들이 그대로 보존되어 복사된다.
~]#cp -r / cp -r 또는 cp -R --recursive 디렉토리를 재귀적으로 복사. => 디렉토리와 그 안의 내용까지 복사할 때 쓰는 옵션이다.
~]#cp-R 디렉터리를 복사할 경우 그 안에 포함된 모든 하위경로와 파일들을 모두 복사한다.
~]#cp -s 파일을 심볼릭 링크 형식으로 복사한다. 원본 파일이름을 절대 경로로 지정해야 한다.
~]#cp -u 복사하는 파일[A]에서 복사할 대상[B]이 있을 때 이 파일의 변경 날짜가 같거나 더 최근의 것이면 복사하지 않는다.
~]#cp -v 복사가 완료되었다는 메시지를 보여주는 옵션
~]#cp -x 원본과 대상 파일의 파일시스템이 다를 경우에는 복사하지 않는다.

2. cp 명령어 일괄 덮어쓰기 설정 2가지 방법

리눅스 명령어인 ‘cp’ 명령어를 사용 중에 ‘overwrite’를 물어보는 경우가 발생합니다.

log]#  cp messages messages_ori
cp: overwrite 'messages_ori'? y
[root@ip-172-26-13-161 log]#

파일이 한 두개일 경우에는 괜찮지만 여러 파일을 복사할 경우 번거로워질 수 있습니다.

이럴 경우 아래와 같은 옵션을 사용하여 명령을 수행할 수 있습니다.

~log]# yes |  cp messages messages_ori
cp: overwrite 'messages_ori'? ~log]#

log]# \cp messages messages_ori

자동으로 덮어쓰기를 물어보지 않고 복사가 됩니다. ‘yes |’ 를 앞에 넣어서 사용하거나 역슬러쉬’\’를 넣어서 사용하는 방법입니다.


간단히 cp 명령어 옵션에 대해 알아 보았습니다.

개요

안녕하세요 피터입니다. 

간혹 리눅스에서 cp 명령어로 파일 또는 디렉토리를 복사할 때 이미 존재하는 파일인 경우에 파일을 덮어쓸지 사용자에게 물어보는 경우가 있습니다.

[root@peterdev test]# cp test1.txt test2.txt
cp: overwrite ‘test2.txt’?

수동으로 복사할 경우에는 y를 입력하여 덮어쓰면 되는데, 여러 파일을 복사하는 경우에는 매 파일마다 y를 입력하는게 귀찮을 수 있습니다.

또한 스크립트로 자동화를 하는 경우에는 사용자에게 물어보는 절차를 생략하고 강제로 덮어쓰고 싶을 때가 있을 것입니다.

그런데 아래처럼 cp 명령어의 -f (강제 적용) 옵션을 사용해도 계속해서 사용자에게 덮어쓸 것인지 물어보는데 이런 경우는 alias 때문입니다.

[root@peterdev test]# cp -f test1.txt test2.txt
cp: overwrite ‘test2.txt’?

cp 라고만 입력해도 cp -i 옵션이 자동으로 들어가도록 alias가 적용되어 있기 때문에 -f 옵션이 듣지 않았던 것입니다.

사실 이러한 alias 는 mv 명령어도 마찬가지입니다.

[root@peterdev test]# alias | grep cp
alias cp='cp -i'
[root@peterdev test]#
[root@peterdev test]# alias | grep mv
alias mv='mv -i'
[root@peterdev test]#

이런 경우에는 아래와 같은 방법으로 해결할 수 있습니다.

1. 절대경로 사용

[root@peterdev test]# which cp
alias cp='cp -i'
        /usr/bin/cp
[root@peterdev test]# /usr/bin/cp -f test1.txt test2.txt
[root@peterdev test]#

which cp 로 cp 명령어의 경로를 확인한 뒤

절대경로로 명령어를 실행하면 alias가 적용되지 않습니다.

2. escape 문자 사용

[root@peterdev test]# \cp -f test1.txt test2.txt
[root@peterdev test]#

\(역슬래시)를 cp 명령어 앞에 붙여주면 마찬가지로 alias가 적용되지 않습니다.

둘 중 아무거나 편한 방법을 사용하시면 사용자에게 물어보지 않고 강제로 덮어쓸 수 있습니다.

마찬가지로 mv 명령을 사용할 때에도 같이 적용 가능합니다.

-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

개인적으로 서버에서 cp 명령어를 사용할 때, 종종 overwrite를 해야하는 경우가 많이 있습니다.

기본적으로 cp에는 alias(별명)이 적용이 되어있는데, 그 내용은 다음과 같습니다.

alias cp='cp -i'

위 alias는 콘솔에서 alias 입력 후 엔터를 치면 확인할 수 있습니다.

위와 같이 설정되어있는 경우, 파일이 적으면 그냥 y를 파일마다 누르면서 넘어가겠지만 그 수가 많은 경우에는 y를 눌러 복사를 수행하기가 매우 불편합니다.

가장 간편한 방법은, unalias cp 명령어를 통해 적용되어있는 cp에 대한 alias를 해제시켜주는 것입니다.

그렇게 되면 현재 터미널 세션이 유지되는 동안 cp에 대한 -i 옵션(interactive)을 사용하지 않은 cp 명령어를 사용할 수 있게 됩니다.

이후, -Rf 옵션을 추가적으로 부여하여, 하위 디렉토리의 내용까지 함께 복사하도록 요청합니다.

/home/data 디렉토리 안에 들어있는 모든 파일 및 디렉토리를 /data 디렉토리로 복사하는 경우, 다음과 같이 사용할 수 있습니다.

cp -Rf /home/data/* /data

-f옵션(–force)에 의해 현재 사용중이 아닌 파일인 경우 해당 파일을 삭제하고 새로운 파일을 쓰게끔 작업이 진행됩니다.

-R옵션(–recursive)에 의해 해당 디렉토리의 하위 디렉토리도 함께 복사할 수 있게 됩니다.

리눅스에서는 -r로 -R을 대신할 수 있습니다. (완전히 동일한 의미)

위 방법 이 아닌 다른 방법이 여러가지 있겠지만, 위의 경우가 가장 간단하게 적용할 수 있는 방법이라고 생각합니다.

다음의 방법도 적용할 수 있습니다.

yes | cp -rf xxx yyy

위 명령어를 통해 xxx파일을 yyy로 만약 overwrite해야하는 경우 자동으로 yes를 입력한 것과 같이 처리해줍니다.