일부 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.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
그 존재를 합리화 할 수 있는가 ? (도트 디렉토리를 구현하지 않는 운영 체제를 지원하는 것 외에 이에 대한 이론적 근거는 문서에 언급되어 있지 않습니다.)
위의 요령은 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
내부에 파일이 남지 않을 것입니다.B
A
도착하다비.
그리고:
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
사용 플래그도 더 명확해졌으며 명령을 수동으로 입력하는 것보다 스크립트에서 명령을 사용할 때 의도하지 않은 결과가 발생할 위험이 줄어듭니다. 스크립트의 경로에 점을 패치하면 모든 종류의 예상치 못한 문제가 발생할 수 있습니다.