때 cp는 이상하게 동작합니다. (dot) 또는 .. (dot dot)은 소스 디렉토리입니다.


15

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

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

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


3
아무도 문서를 찾을 수 없다는 것은 무엇을 의미합니까? cp참조 하는 방법을 명확하게 설명 cp -R작동합니다. .그리고 ..다른 모든 디렉토리와 같은 디렉토리는, 아무것도 마법 또는 그들에 대한 신비가있다.
AlexP

2
@ AlexP 나는 대답을 명확하게하기 위해 편집했습니다. 요점은 것입니다 ...다른 디렉토리처럼 행동하지 않습니다.
iFreilicht

답변:


27

동작은에 대한 문서화 된 알고리즘의 논리적 결과입니다 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.


그러나 같은 방식으로 작동하지 않습니다. 지정 src에 디렉토리를 복사합니다 dest, src/.내용을 복사합니다. 질문에서 더 명확하게하려고 노력할 것입니다.
iFreilicht

거기에서 나는 그것이 당신의 근본적인 질문에 대답한다고 생각합니다.
Stephen Kitt

1
스테판 @ 영업 이익은 복사를 비교 src/.하고 src/*(주, 하지 src/.* ); src/*globbing이 무시할 경우 숨겨진 파일은 포함되지 않습니다 ...
Stephen Kitt

1
흠, " source_file을 포함하는 디렉토리 ". 글쎄, 분명히 src포함 src/.하지만 디렉토리의 포함 디렉토리는 디렉토리의 이름을 지정하는 방법에 따라 다릅니다. 물론 .어떤 방식 으로든 링크 가 존재 한다는 것은 모든 디렉토리가 자신을 포함하지만 모든 사람에게 직관적이지 않을 수도 있음을 의미합니다. 대신에이 문제의 하나는 또한 "디렉토리가 포함 디렉토리 가정 유혹 수 foo에 의해 결정된다"를 foo/..하는 경우는 문제가되지 우리가 참조하는 경우 것에, foo또는 foo/.결과가 포함 디렉토리가 동일 다음과 같습니다.
ilkkachu

1
의 차이라고하는 어떤 foo과는 foo/.조금 민감한 것 같다,하지만 난 상관 없어, 나는 또한 약간 즐겁게 찾을 수 있습니다.
ilkkachu

1

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

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

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

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