일부 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
$
즉, 예기치 않은 복사 후 서브 디렉토리로의 성공 대신 경고와 종료 상태가 좋지 않아 스크립트가 중단되고 디렉토리가없는 이유를 사람이 검사 할 수 있습니다. 하나입니다.
답변
명령을 수동으로 입력하는 대신 스크립트에서 사용할 때 플래그를 사용하는 것이 훨씬 명확하고 의도하지 않은 영향의 위험이 줄어 듭니다. 스크립트에서 경로에 점을 패치하면 예기치 않은 모든 종류의 장난이 발생할 수 있습니다.