왜 'cp -r ../* .'는 작동하지만 "cp -r ..."은 작동하지 않습니다.

왜 'cp -r ../* .'는 작동하지만 "cp -r ..."은 작동하지 않습니다.

나무가 있는 경우:

.
├── child
├── dir1
├── dir2
├── dir3
├── file1
├── file2
└── file3

다음은 이러한 명령을 실행한 결과입니다 child. 이 명령은 모든 파일과 디렉터리를 작동하고 복사합니다.

cp -r ../* .
----
cp: cannot copy a directory, '../child', into itself, './child'

이는 child파일만 복사하고 디렉터리는 복사하지 않습니다.

cp -r .. .
----
cp: cannot copy a directory, '..', into itself, '.'

답변1

실제 실행된 명령을 봅니다.

$ set -x; cp -r ../* .
+ cp -r ../child ../dir1 ../dir2 ../dir3 ../file1 ../file2 ../file3 .
cp: cannot copy a directory, '../child', into itself, './child'
$ set -x; cp -r .. .
+ cp -r .. .
cp: cannot copy a directory, '..', into itself, '.'

두 명령 모두 디렉터리를 자체적으로 복사하려고 시도하여 루프가 발생합니다. 구현은 cp이를 감지하고 어느 시점에서 중지하거나 무기한 복사를 계속할 수 있습니다(예: GNU 및 BusyBox cp중지, FreeBSD는 cp파일 이름 길이 제한에 도달할 때까지 계속 복사합니다. 마찬가지로 cpMacOS에서도 복사는 다음과 같이 계속됩니다.U&L에 대한 또 다른 질문제안된 것 같습니다).
그럼에도 불구하고 디렉터리를 자신에게 재귀적으로 복사하면 결국 오류가 발생하면서 중지됩니다.

질문이 GNU cp(GNU/Linux 시스템에 있는 것)에 관한 것이라고 가정하면 일반적으로 두 번째 명령( cp -r .. .)이 복사됩니다.(예측할 수 없는?) 부분트리의 루트에서 ..루프를 감지하고 트리의 어떤 항목도 추가로 처리하지 않고 오류와 함께 중지됩니다.

반면, 첫 번째 명령( cp -r ../* .) 에는 cp8개의 개별 인수가 제공됩니다. child의 내용을 복사하는 데 실패 하는 동안 child다른 디렉터리와 파일에는 child자신이 포함되어 있지 않으므로 문제 없이 복사됩니다. 그러나 이는
루프를 감지하지 못하고 지속적으로 재귀 복사본을 만드는 시스템에서는 예상대로 "작동"하지 않습니다.cp


보다 안전한 접근 방식으로 상위 디렉터리의 모든 내용을 현재 디렉터리( child)에 복사하려면(현재 디렉터리 자체는 제외) 다음을 사용할 수 있습니다.

$ shopt -s nullglob dotglob extglob
$ cp -r ../!(child) .

관련 정보