그 당시 CP는 매우 이상하게 행동했습니다. (점) 또는 .. (점)은 소스 디렉터리입니다.

그 당시 CP는 매우 이상하게 행동했습니다. (점) 또는 .. (점)은 소스 디렉터리입니다.

이 답변다음과 같이 디렉터리의 모든 파일(숨김 파일 포함)을 src디렉터리로 복사할 수 있음이 밝혀졌습니다.dest

mkdir dest
cp -r src/. dest

답변이나 의견에는 이것이 실제로 작동하는 이유에 대한 설명이 없으며 이에 대한 문서를 찾은 사람은 아무도 없는 것 같습니다.

나는 몇 가지를 시도했습니다. 첫째, 정상적인 상황:

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file  src

그런 다음 /.마지막으로:

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file  .dotfile  src_dir  src_file

따라서 와 유사하게 동작 *하지만 숨겨진 파일도 복사합니다.

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file  src_dir  src_file

.그리고 ..올바른 하드 링크가 있습니까?여기에 설명되어 있습니다, 디렉토리 항목 자체와 같습니다.

이 동작은 어디에서 발생하며 어디에 문서화되어 있나요?

답변1

이 동작은 녹음 알고리즘의 논리적 결과입니다 cp -R. 바라보다POSIX, 2f단계:

디렉토리의 파일소스 파일이 디렉토리에 복사해야 합니다대상 파일, 여기에 나열된 네 단계(1~4)를 수행하면 파일은 다음과 같습니다.소스 파일.

...디렉토리는 각각 현재 디렉토리와 상위 디렉토리입니다. 쉘에 관한 한 둘 다 특별하지 않으므로 확장도 포함되지 않으며 숨겨진 파일을 포함하여 디렉토리가 복사됩니다. *반면에 파일 목록으로 확장되며 여기에서 숨겨진 파일이 필터링됩니다.

src/.내부의 현재 디렉토리는 다시 상위 디렉토리 src이므로 외부에서 또는 소스 파일로 지정하는 것은 src동일 하며 숨겨진 파일을 포함하여 내용을 복사합니다.src/src_dir/..src_dirsrcsrcsrcsrc/.src/src_dir/..cpsrc

지정의 요점은 디렉토리(또는 디렉토리에 대한 심볼릭 링크)가 아닌 경우 src/.실패하지만 그 반대는 아니라는 것입니다. 또한 자체가 아닌 내용만 복사합니다. 이는 문서와도 일치합니다.srcsrcsrcsrc

만약에표적기존 디렉터리가 존재하고 이름이 지정되며 파일 계층의 각 파일에 해당하는 대상 경로의 이름이 연결되어야 합니다.표적, 단일 슬래시 문자(대상이 슬래시로 끝나지 않는 경우) 및 포함 디렉토리에 대한 상대 파일의 경로 이름소스 파일.

따라서 cp -R src/. destto(소스 파일이 있는 위치)의 내용이 복사되고, to(소스 파일이 있는 위치)의 내용이 복사됩니다.srcdest/..srccp -R src destsrcdest/srcsrc

그것에 대해 생각하는 또 다른 방법은 합계를 비교하는 대신 복사본 src/src_dir과 합계를 비교하는 것입니다 . 동작은 이전 사례 와 같습니다 .src/.src/.src.src_dir

답변2

실행하면 을 cp -R src/foo dest얻습니다 dest/foo. 따라서 디렉터리가 dest/foo존재하지 않으면 cp디렉터리가 생성된 다음 해당 내용 src/foodest/foo.

를 실행하면 cp -R src/. dest이 있는 것을 cp확인한 dest/.다음 내용을 src/.에 복사하면 됩니다 dest/..

.from이라는 디렉터리를 복사 src하고 그 내용을 기존 디렉터리와 병합하는 것으로 생각하면 dest/.이해가 됩니다 .

관련 정보