cp -r의 구문 차이점과 이를 극복하는 방법

cp -r의 구문 차이점과 이를 극복하는 방법

우리가 빈 디렉토리에 있다고 가정해 봅시다. 그런 다음 다음 명령을 실행합니다.

mkdir dir1
cp -r dir1 dir2

두 개의 (빈) 디렉토리 dir1dir2그 사본이 dir2생성됩니다 dir1. 그러나 이렇게 하면:

mkdir dir1
mkdir dir2
cp -r dir1 dir2

그런 다음 우리는 dir1그것이 지금 내부에 놓여 있다는 것을 발견했습니다 dir2. 이것은 의미한다똑같은 cp명령은 대상 디렉터리의 존재 여부에 따라 다르게 동작합니다.. 그렇다면 cp명령은 동일한 작업을 수행합니다.

mkdir dir1
mkdir dir2
cp -r dir1 dir2/.

이것은 나에게 매우 반직관적인 것 같습니다. cp -r dir1 dir2( dir2이미 존재하는 경우) 기존 항목(및 모든 콘텐츠)을 삭제 dir2하고 이를 대체할 것으로 예상합니다 . 이는 dir1두 파일에 사용될 때의 동작이기 때문입니다. cpLinux(더 일반적으로는 Unix 계열 시스템)에 디렉토리가 존재하는 방식 때문에 재귀 복사 자체가 약간 다르다는 것을 알고 있지만 더 많은 설명을 찾고 있습니다.이 동작이 선택되었습니다. 내가 예상한 대로 작동하는지 확인하는 방법을 알려주시면 cp보너스 포인트가 됩니다 (미리 대상 디렉터리를 테스트하고 삭제하지 않고). 여러 가지 옵션을 시도했지만 cp운이 없었습니다. rsync명령을 모르는 다른 사람들을 위해 해결책을 받아들일 것 같습니다 .

이 동작이 보편적이지 않으면 CentOS에서 bash를 사용하고 있습니다.

답변1

당신이 찾고있는 행동은특별한 경우:

cp -R [-H|-L|-P] [-fip] source_file... target

[This] 형식은 -R 옵션이 지정된 두 개 이상의 피연산자로 표현됩니다. cp 유틸리티는 각 source_file의 파일 계층 구조에 있는 각 파일을 다음과 같은 이름의 대상 경로에 복사해야 합니다.

  • target이 존재하고 기존 디렉터리의 이름을 지정하는 경우 파일 계층 구조의 각 파일에 해당하는 대상 경로 이름은 target, 단일 <slash>문자(target이 로 끝나지 않는 경우 <slash>) 및 해당 디렉터리에 대한 파일 경로 이름의 연결이어야 합니다. . source_file이 포함된 디렉터리입니다.
  • target이 존재하지 않고 두 개의 피연산자가 지정된 경우 source_file에 해당하는 대상 경로 이름은 target입니다. 파일 계층의 다른 모든 파일에 대한 해당 대상 경로 이름은 <slash>source_file에 상대적인 대상, 문자 및 파일 경로 이름 입니다. 시리즈.

대상이 존재하지 않고 피연산자가 2개 이상 지정되면 오류가 발생합니다...

cp그래서 나는 당신이 원하는 것을 하는 것이 불가능하다고 말하고 싶습니다 .


예상되는 동작은 " cp -r dir1 dir2( dir2이미 존재하는 경우)이므로 기존 dir2(및 모든 콘텐츠)은 삭제되고 dir1":

rm -rf dir2 && cp -r dir1 dir2

존재 하는지 확인할 필요도 없습니다 dir2.


해결책은 소스에 후행을 추가하여 rsync소스 자체가 복사되지 않고 to의 내용이 복사되도록 하는 것입니다(기존 파일은 계속 유지됨)./dir1dir2dir1dir2dir2

$ tree dir*
dir1
└── test.txt
dir2
└── test2.txt

0 directories, 2 file
$ rsync -a dir1/ dir2
$ tree dir*           
dir1
└── test.txt
dir2
└── test.txt
└── test2.txt

0 directories, 3 files
$ rm -r dir2          
$ rsync -a dir1/ dir2
$ tree dir*           
dir1
└── test.txt
dir2
└── test.txt

0 directories, 2 files

답변2

cp에는 여러 가지 형식이 있습니다.

   cp [OPTION]... [-T] SOURCE DEST
   cp [OPTION]... SOURCE... DIRECTORY
   cp [OPTION]... -t DIRECTORY SOURCE...

이렇게 하면 cp -r dir1 dir2두 번째 인수에 대한 암시적 평가가 예상됩니다.

  • 두 번째 인수가 파일 시스템에 존재하지 않는 이름인 경우 cp는 이를 DEST로 해석하여 생성합니다. copyind dir1~처럼목차 2.
  • 이미 존재하는 경우 디렉터리로 해석되어 dir1이 복사됩니다.입력하다그것.

초기 상태가 확실하지 않고 다중 해석 가능성을 피하려면 다음 옵션을 사용하여 간단히 명시적으로 만들 수 있습니다 -T.

$ tree dir*
dir1
└── test.txt
dir2
└── test2.txt

0 directories, 2 file
$ cp -r dir1 -T dir2
$ tree dir*           
dir1
└── test.txt
dir2
└── test.txt

0 directories, 3 files
$ rm -r dir2          
$ cp -r dir1 -T dir2
$ tree dir*           
dir1
└── test.txt
dir2
└── test.txt

0 directories, 2 files

관련 정보