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

일부 GNU Coreutils 명령에 -T/--no-target-directory옵션 이있는 이유는 무엇 입니까? .전통적인 Unix 디렉토리 계층에서 (self dot) 의 의미를 사용하여 수행 할 수있는 모든 것처럼 보입니다 .

치고는:

cp -rT /this/source dir

-T옵션은 사본이 dir/source서브 디렉토리 를 작성하지 못하게합니다 . 오히려 /this/source로 식별되고 dir그에 따라 내용이 트리간에 매핑됩니다. 예를 /this/source/foo.c들어가 dir/foo.c아니라 계속 진행 합니다 dir/source/foo.c.

그러나 이것은 다음 -T을 사용 하는 옵션 없이 쉽게 수행 할 수 있습니다 .

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

의미 상 후미 점 구성 요소는의 하위 요소로 복사 dir되지만 물론 “하위”는 이미 존재하므로 실제로 작성 될 필요가 dir없으므로 그 결과는 /this/path로 식별됩니다 dir.

현재 디렉토리가 대상이면 제대로 작동합니다.

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

그것의 존재를 합리화 할 수있는 것만 으로 할 수있는 일이 -T있습니까? (dot 디렉토리를 구현하지 않는 운영 체제에 대한 지원 외에 설명서에서 언급되지 않은 근거)

위의 도트 트릭은 GNU 정보 문서에서 언급 한 것과 동일한 경쟁 조건을 해결하지 못 -T합니까?



답변

당신의 .당신이 디렉토리가 아닌 파일을 복사 할 때 트릭에만 사용할 수 있습니다. 이 -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


답변

원래 설계된대로 cp/ mv/ 의 문제점 ln은 두 개의 명령 ( 복사복사 )이라는 것입니다.

cp A B

중 하나 인 B에 복사 또는 B에 복사 ( B / A A를 복사 여부에 따라) B이 존재하고 (B 디렉토리 심볼릭 링크 경우와 더 유사) 디렉토리 나 아니다.

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

cp -T A B

상관없이 A를 B로 복사합니다 . 경우 B존재하고 디렉토리입니다 (당신이 통과하지 않는 한, 그것은 실패합니다 -r). 어떤 경우에, 당신은 최종 최대되지 않습니다와 A파일 내부 B가 의도 할 때 A복사 할 B.

과:

cp -t B A

에 대한 사본 입니다.


답변

-T디렉토리가 잘못 대상 파일이어야합니다 어떤이있는 경우 실패를 제공 할 수 있습니다 :

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

즉, 예기치 않은 복사 후 서브 디렉토리로의 성공 대신 경고와 종료 상태가 좋지 않아 스크립트가 중단되고 디렉토리가없는 이유를 사람이 검사 할 수 있습니다. 하나입니다.


답변

명령을 수동으로 입력하는 대신 스크립트에서 사용할 때 플래그를 사용하는 것이 훨씬 명확하고 의도하지 않은 영향의 위험이 줄어 듭니다. 스크립트에서 경로에 점을 패치하면 예기치 않은 모든 종류의 장난이 발생할 수 있습니다.


답변