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


26

일부 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합니까?

답변:


29

당신의 .당신이 디렉토리가 아닌 파일을 복사 할 때 트릭에만 사용할 수 있습니다. 이 -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 /path/to/file /target/dir/. 경우 /target/dir/file존재하고 디렉토리입니다, 당신은 같은 진단을 얻을! 그러나 -T경쟁 조건이 없으면 한 단계만으로 수행 할 수없는 작업을 보여주었습니다 . 파일을 복사하고 하위 디렉토리로 분류하지 않고 파일 이름을 변경하십시오.
Kaz

3
그것은 동일하지 않습니다. .당신이 말하는 트릭 /.소스에 추가 하는 것 입니다 .
Barmar

21

원래 설계된대로 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

에 대한 사본 입니다.


독창적 인 유닉스 철학은 자신이하는 일을 알고 있다고 가정하고 행복하게 발을 쏠 수 있도록하는 것입니다.
Lenne

4
@Lenne, 그러나 여기에서는 발로 자신을 촬영하는 것을 피할 수있는 방법을 제공하지 않습니다. 누군가가 B 디렉토리를 작성하거나 cp A B명령 을 실행하기 직전에 일부 디렉토리에 대한 심볼릭 링크를 작성 하면 명령이 의도 한대로 수행되지 않습니다. 그리고 [ -e B ] || [ -L B ] || cp A B여전히 경쟁 조건 cp -Tn A B이 없습니다.
Stéphane Chazelas 2016 년

6

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

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

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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.