cp -r과 cp -R의 차이점 (복사 명령)


60

cp -r파일을 재귀 적 cp -R으로 복사하고 디렉토리를 재귀 적으로 복사하기위한 것입니다. 그러나 나는 확인했고 둘 다 파일과 디렉토리를 똑같이 복사하는 것처럼 보입니다. 그렇다면 실제로 차이점은 무엇입니까?


2
Linux 매뉴얼에서 이러한 옵션에 대한 언급은 모두 동의어입니다. (그들은 다른 유닉스 변형이 아닙니다.)
Gilles

답변:


74

하지만 -RPOSIX는 잘 정의이며, -r이식 할 수 없습니다!

리눅스에서의 GNU와 비지 박스 구현에 cp, -r-R동일합니다.

다른 측면에서, 당신이 읽을 수있는 POSIX 의 매뉴얼 페이지 cp, -r동작입니다 구현 정의 .

    * If  neither  the  -R  nor  -r  options were specified, cp shall take
      actions based on the type and contents of the file referenced by the
      symbolic link, and not by the symbolic link itself.

    * If the -R option was specified:

       * If  none  of  the  options  -H,  -L, nor -P were specified, it is
         unspecified which of -H, -L, or -P will be used as a default.

       * If the -H option was specified, cp shall take  actions based on
         the type and contents of the file referenced by any symbolic link
         specified as a source_file operand.

       * If the -L option was specified, cp shall take  actions based  on
         the type and contents of the file referenced by any symbolic link
         specified as a source_file operand or any symbolic links encoun-
         tered during traversal of a file hierarchy.

       * If  the  -P option was specified, cp shall copy any symbolic link
         specified as a source_file operand and any symbolic links encoun-
         tered  during traversal of a file hierarchy, and shall not follow
         any symbolic links.

    * If the -r option was  specified,  the  behavior  is implementation-
      defined.

14
차이점 중 하나는 예를 들어 OSX에서 -r심볼릭 링크가 가리키는 실제 파일 -R을 복사하고 대부분의 경우 의도 한 심볼릭 링크를 복사한다는 것입니다.
nacho4d

19

차이점은 하나는 소문자 "R"을 사용하고 다른 하나는 대문자 "R"을 사용한다는 것입니다. 그 외에도 차이는 없습니다. --recursivelong 옵션 을 사용하는 경우에도 마찬가지입니다 .


4
매뉴얼 페이지에서 : -R, -r, --recursive-재귀 적으로 디렉토리 복사
Dave Jennings

6
@DaveJennings : 하나의 플랫폼에서 동등하다고해서 모든 플랫폼에 있다는 의미는 아닙니다. 일부 구현 cp에는 실제로 구별이 있습니다. Random832의 답변을 참조하십시오 . @Ignacio 당신은이 답변에 "당신 cp이 현대 GNU 구현 이라면 "또는 이와 비슷한 것을 나타내는 한정자를 포함시켜야 합니다.
Caleb

@Caleb : 질문은 "linux"로 태그되었습니다. 다른 무엇입니까?
Ignacio Vazquez-Abrams

3
-R과 -r은 내가 사용하는 일부 시스템 (OS X, FreeBSD, BusyBox coreutils에서 현재 동작이 확실하지 않음)에서 다른 동작을합니다. 나는 오래 전에 항상 사용하는 것이 현명하다고 결정 -R했으며 실제로 방금 언급 한 시스템의 매뉴얼 페이지 중 일부도 권장합니다.
dubiousjim

17

소문자 -r는 4.1BSD에 도입 된 이전 옵션으로, 모든 비 디렉토리를 파일로 간단히 복사합니다. 즉, 장치 또는 FIFO가 발생하면 장치를 열고 내용을 읽고 내용이있는 대상에서 파일을 만듭니다.

대문자 -R-r장치, FIFO 또는 기타 특수 파일을 발견 할 때 대상에서 동등한 특수 파일을 만드는 표준화 된 옵션 (4.4BSD에서 BSD에 도입되었지만 이전 버전에서는의 동의어로 사용 되었음 )이었습니다.

많은 구현들이 여전히 이러한 차이를 유지하지만, 일부 (Linux에 일반적인 GNU 버전 포함) 는 동의어로서 -R의미를 제공합니다 -r.


3

OS X 및 이전 버전의 FreeBSD -r-R -L --copy-contentscoreutils 와 유사 하거나 심볼릭 링크를 따르고 특수 파일 및 FIFO의 내용을 읽습니다.

mkdir a;touch b;ln -s $PWD/b a;cp -r a cOS X에서 symlink를 대상 파일로 바꾸고 mkdir a;mkfifo a/b;cp -r a cFIFO 읽기를 차단 하고 0으로 mkdir a;ln -s /dev/zero a;cp -r a b채우기 시작합니다 b/zero.

보내는 사람 cpOS X와 FreeBSD의 이전 버전에서 매뉴얼 페이지

Historic versions of the cp utility had a -r option.  This implementation
supports that option; however, its use is strongly discouraged, as it
does not correctly copy special files, symbolic links, or fifo's.

새로운 버전의 FreeBSD -r는 다음과 같습니다 -RL.

Historic versions of the cp utility had a -r option.  This  implementation
supports that option, however, its  behavior is different from historical
FreeBSD behavior.   Use of this option is strongly discouraged as the
behavior is implementation-dependent.  In FreeBSD,  -r is a synonym for
-RL and works the same unless modified by other flags.  Historical  imple-
mentations  of -r differ as they copy special files as normal files while
recreating  a hierarchy.

http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :

--copy-contents

재귀 적으로 복사하는 경우 특수 파일 (예 : FIFO 및 장치 파일)의 내용을 마치 일반 파일 인 것처럼 복사하십시오. 즉, 각 소스 파일의 데이터를 읽고 대상에 쓰려고합니다. 일반적으로이 옵션은 FIFO와 같은 특수 파일 및 일반적으로 /dev디렉토리 에있는 파일에 바람직하지 않은 영향을 미치므로이 옵션을 사용하는 것은 실수 입니다. 대부분의 경우, cp -R --copy-contentsFIFO 및와 같은 특수 파일을 읽으려고 시도하면 무기한 정지 /dev/console되며 복사 할 때 대상 디스크를 채 웁니다 /dev/zero. 이 옵션은 재귀 적으로 복사하지 않으면 적용되지 않으며 심볼릭 링크의 복사에는 영향을 미치지 않습니다.


-1

차이점 중 하나는 -r은 숨겨진 디렉토리를 복사하지 않지만 -R은 숨겨진 디렉토리를 복사한다는 것입니다.

대상 디렉토리에서 .git 디렉토리를 테스트하고 위의 결론에 도달했습니다. 현재 centOS를 사용하고 있습니다.

내가 틀렸을 수도 있지만 토론에 열려 있습니다.


4
CentOS 5에서는 이것을 보지 못했습니다. -r그리고 -R둘 다 숨겨진 디렉토리를 복사
Michael Mrozek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.