`cp -a ./dir`이 디렉토리 대신 내용을 복사하는 이유는 무엇입니까?

`cp -a ./dir`이 디렉토리 대신 내용을 복사하는 이유는 무엇입니까?

현재 있는 디렉토리를 복사하고 싶습니다. 나는 전에 시도했다cp -a . ~/xyz

디렉토리의 내용을 복사하지만 다음과 같이 작동합니다.cp -a "$(pwd)" ~/xyz
[필요에 따라 내용이 포함된 디렉터리도 복사됩니다. ]

Dot은 Splat이 수행하는 작업을 수행하는 것 같습니다. 왜 작동하지 않습니까 .?

답변1

.이는 하위 디렉터리를 생성하는 데 해당 이름을 사용할 수 없기 때문에 수행됩니다 .

cp -a . ~/xyz, 등 ./file1으로 복사합니다 . 그러나 및 는 동일하므로 현재 디렉터리의 내용을 .~/xyz/./file1./file2~/xyz/./file2~/xyz/./file1~/xyz/file1~/xyz

--verbosecp복사할 때 각 경로 이름을 표시 하는 옵션을 추가하면 이를 확인할 수 있습니다.

$ cp -av . ../foo/
‘./file1’ -> ‘../foo/./file1’
‘./file2’ -> ‘../foo/./file2’

.이것 과 여기 *의 주목할만한 차이점 중 하나 는 (숨김 파일과 일치하지 않음)과 달리 cp -a . /dir숨겨진 파일을 복사 한다는 것입니다.*

~이는 *쉘 메타 문자입니다. 즉, cp쉘이 보기 전에 확장된다는 의미입니다. 반면에 는 .일반 디렉터리 항목입니다(이 항목이 포함된 디렉터리를 가리킵니다). 재귀 복사본이 소스인 cp경우를 감지하고 디렉터리 이름을 바꾸는 코드를 포함 할 수 있지만 .그렇지 않습니다. 아마도 아무도 그것이 중요하다고 생각하지 않기 때문일 것입니다.

또한, 어떤 이름으로 불러야 할까요? 파일 시스템은 일반적으로 디렉토리에 대한 다중 하드 링크를 허용하지 않기 때문에 파일보다 디렉토리에 대해 더 간단합니다( ...항목 제외). 그러나 이것은 심볼릭 링크를 고려하지 않습니다. 최신 쉘은 심볼릭 링크를 통해 디렉토리에 들어갈 때 이를 추적하고 이를 pwd.

관련 정보