GNU cp 및 mv에서 -T 옵션의 추가 값은 무엇입니까?

GNU cp 및 mv에서 -T 옵션의 추가 값은 무엇입니까?

일부 GNU Coreutils 명령에 이 -T/--no-target-directory옵션이 있는 이유는 무엇입니까? 이것이 수행하는 모든 작업 .은 전통적인 Unix 디렉터리 계층 구조의 (자체 점) 의미 체계를 사용하여 구현할 수 있는 것 같습니다 .

고려하면:

cp -rT /this/source dir

-T옵션은 복사본이 dir/source하위 디렉터리를 생성하는 것을 방지합니다. 대신 콘텐츠가 /this/source그에 따라 트리 간에 식별되고 매핑됩니다. dir예를 들어 to 대신 등으로 /this/source/foo.c이동합니다 .dir/foo.cdir/source/foo.c

하지만 -T다음 옵션을 사용하지 않고도 이 작업을 쉽게 수행할 수 있습니다.

cp -r /this/source/. dir  # Probably worked fine since dawn of Unix?

의미상 후행 점 구성 요소는 의 하위로 복사되지만 dir물론 해당 "하위"는 이미 존재하고(따라서 생성될 필요가 없음) 실제로 그 자체이므로 로 식별하는 dir효과가 있습니다 ./this/pathdir

현재 디렉터리가 대상인 경우 이는 훌륭하게 작동합니다.

cp -r /this/tree/node/. . # node's children go to current dir

당신이 할 수 있는 일이 있나요오직-T그 존재를 합리화 할 수 있는가 ? (도트 디렉토리를 구현하지 않는 운영 체제를 지원하는 것 외에 이에 대한 이론적 근거는 문서에 언급되어 있지 않습니다.)

위의 요령은 GNU Info 문서에 언급된 동일한 경쟁 조건을 해결하지 않습니까 -T?

답변1

귀하의 .트릭은 파일이 아닌 디렉토리를 복사할 때만 작동합니다. 이 -T옵션은 디렉터리와 파일에 적용됩니다. 이렇게 하면:

cp srcfile destfile

destfile그리고 에 복사될 이름이 지정된 디렉토리가 이미 있는데 destfile/srcfile이는 아마도 의도적인 것이 아닐 것입니다. 그래서 당신은

cp -T srcfile destfile

오류가 올바르게 발생합니다.

cp: cannot overwrite directory `destfile' with non-directory

이 방법을 시도하면 .복사본이 작동하지 않습니다.

cp: cannot stat `srcfile/.`: Not a directory

답변2

cp//원래 디자인의 문제점은 두 개의 명령이 mv하나에 포함되어 있다는 것입니다(ln에게 복사그리고에게 복사).

cp A B

또는A를 B로 복사또는A를 B로 복사(A를 B/A로 복사B)는 B 가 존재하고 디렉터리인지 여부에 따라 달라집니다 (B가 디렉터리에 대한 심볼릭 링크인 경우 더 많은 변형이 가능함).

모호하기 때문에 이것은 나쁘다. 따라서 GNU 구현에는 이 문제를 해결하기 위한 옵션이 추가되었습니다.

cp -T A B

A를 B로 복사에도 불구하고. B존재하고 디렉토리인 경우 실패합니다(를 전달하지 않는 한 -r). 어쨌든, 복사하려고 할 때 A내부에 파일이 남지 않을 것입니다.BA도착하다비.

그리고:

cp -t B A

~이다에게 복사.

답변3

-T대상 파일의 디렉터리가 올바르게 존재하지 않으면 오류가 발생할 수 있습니다.

$ mkdir mustbeafile
$ touch afile
$ cp -T afile mustbeafile
cp: cannot overwrite directory `mustbeafile' with non-directory
$ echo $?
1
$ cp afile mustbeafile
$ 

즉, 실수로 하위 디렉터리에 성공적으로 복사하는 대신 경고 및 잘못된 종료 상태가 표시되어 스크립트가 중단될 수 있으며, 존재해서는 안 되는 디렉터리가 있는 이유를 수동으로 검사하면 됩니다.

답변4

사용 플래그도 더 명확해졌으며 명령을 수동으로 입력하는 것보다 스크립트에서 명령을 사용할 때 의도하지 않은 결과가 발생할 위험이 줄어듭니다. 스크립트의 경로에 점을 패치하면 모든 종류의 예상치 못한 문제가 발생할 수 있습니다.

관련 정보