때 cp는 이상하게 동작합니다. (dot) 또는 .. (dot dot)은 소스 디렉토리입니다. 의견에는 설명이 없으며 아무도 이것에 대한

이 답변 은 숨겨진 파일을 포함하여 모든 파일을 디렉토리에서 디렉토리 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

...같은 적절한 하드 링크는 여기에서 설명하는 단지 디렉토리 항목 자체처럼.

이 행동은 어디에서 왔으며 어디에 기록되어 있습니까?



답변

동작은에 대한 문서화 된 알고리즘의 논리적 결과입니다 cp -R. POSIX , 2f 단계를 참조하십시오 .

source_file 디렉토리의 파일은 여기에 나열된 4 단계 (1-4)를 source_files 로 사용하여 dest_file 디렉토리로 복사해야합니다 .

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

src/.현재 디렉토리 내부에 src있다, src그 자체; src/src_dir/..입니다 src_dir다시는 ‘부모 디렉토리, src. 그래서 외부에서 src, 경우는 src지정하는 디렉토리 src/.src/src_dir/..에 대한 소스 파일로 cp동일하고 내용 복사 src숨겨진 파일을 포함하여.

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

경우 대상이 기존 디렉토리 존재와 이름, 파일 계층의 각 파일에 해당하는 대상 경로의 이름의 연결한다 대상 , 단일 슬래시 문자 대상이 슬래시로 끝나지 않은 경우, 파일의 상대 경로 이름 디렉토리 포함에 source_file .

그래서 cp -R src/. dest사본의 내용 srcdest/.(소스 파일이 .있는 src), 반면 cp -R src dest사본의 내용 src으로는 dest/src(소스 파일입니다 src).

이 생각하는 또 다른 방법은 복사 비교하는 것입니다 src/src_dirsrc/.보다는 비교 src/.하고 src. 전자의 경우 .처럼 작동합니다 src_dir.


답변

당신이 실행 cp -R src/foo dest하면 얻을 것이다 dest/foo. 디렉토리가 경우에 따라서 dest/foo존재하지 않는, cp그것을 만들 것입니다, 다음의 내용을 복사 src/foodest/foo.

당신이 실행하면 cp -R src/. dest, cp그보고 dest/.존재하고, 그것은의 내용을 복사 단지 문제는 src/.로를 dest/..

라는 이름의 디렉토리에 복사로 생각할 때 .부터를 src기존 디렉토리와 그 내용을 병합 dest/., 그것은 이해가됩니다.