cp, 후행 슬래시, 동일한 디렉토리에 복사 또는 다른 디렉토리에 복사

cp, 후행 슬래시, 동일한 디렉토리에 복사 또는 다른 디렉토리에 복사

한 디렉터리를 다른 디렉터리로 복사하려면 첫 번째 디렉터리에 슬래시가 없어야 합니다.

# example 1
# this command will copy dir1 to dir2
# (dir2 is preexisting)
cp -Rip dir1 dir2/

그렇지 않으면 명령은 디렉터리 자체가 아닌 디렉터리 내용을 복사합니다.

# example 2
# this command will copy dir1 contents to dir2
# (dir2 is preexisting)
cp -Rip dir1/ dir2/

dir1나는 과 here 의 차이점을 이해하고 있으며 dir1/, 이 두 명령이 작동하는 방식의 차이점이 나를 혼란스럽게 하지 않습니다.

그러나 다른 디렉터리가 아닌 현재 있는 동일한 디렉터리에 디렉터리를 복사하려는 경우 뒤에 오는 슬래시는 아무런 차이가 없습니다. 왜?

# example 3
# any of these commands will make a dir1 copy
# (dir1-copy isn't preexisting)
cp -Rip dir1 dir1-copy/
cp -Rip dir1/ dir1-copy/

밀접하게 관련된 또 다른 문제가 있습니다. How mv dir1/ dir2/mv dir1 dir2/Work 사이에 차이가 없는 이유는 무엇입니까 ? 즉, 소스 디렉터리 끝에 있는 후행 슬래시가 mv예제 3의 논리를 따르지만 cp예제 1과 2의 논리를 따르지 않는 이유는 무엇입니까?

macOS 14.3.1, zsh 5.9(x86_64-apple-darwin23.0)

답변1

cp -R dir1 dir2와 사이의 동작 차이는 cp -R dir1/ dir2FreeBSD에 추가된 기능입니다.버전 5.4. 최소한 당시 매뉴얼에는 -R옵션을 설명하기 위해 다음 문장이 추가되었습니다.

/로 끝나면 source_file디렉터리 자체가 아닌 디렉터리의 내용이 복사됩니다.

이 동작은 더 오래되었을 수 있으며 5.4는 문서의 공백을 메울 뿐입니다. 그런 내용은 없어요5.0,5.1,5.2,5.3또는5.4릴리즈 노트. 아직 소스 다이빙을 해본 적이 없습니다.

FreeBSD 명령줄 유틸리티가 포함된 최신 버전의 FreeBSD 및 macOS는 이 동작을 유지합니다. 다른 시스템(GNU, BusyBox, OpenBSD, NetBSD 또는 모든 POSIX 호환 시스템)에는 이 동작이 없으며 정확하게 동일한 동작을 갖습니다(심볼릭 링크가 아닌 한 cp -R dir1/ dir2: 링크 를 따라가게 함).cp -R dir1 dir2dir1dir1/

FreeBSD의 동작은 동일한 구별을 갖는 rsync에서 영감을 얻었을 수 있습니다. 나는 그들이 이전 버전과 호환되지 않는 변경을 했다는 것이 이상하다고 생각합니다.

그러나 다른 디렉터리가 아닌 현재 있는 동일한 디렉터리에 디렉터리를 복사하려는 경우 뒤에 오는 슬래시는 아무런 차이가 없습니다. 왜?

이것은 이상한 디자인 결정입니다. 아니면 디자인 결정이 아니라 구현 버그(소스 경로를 구문 분석하고 후행 슬래시 뒤의 부분이 경로 구성 요소인지 확인)일 수도 있으며 함수를 호출하기로 결정했습니다. rsync를 사용하면 대상 디렉터리가 존재하지 않는 경우에도 후행 슬래시가 해당 동작을 유지합니다.

mv dir1/ dir2/mv dir1 dir2/How와 Work 사이에 차이가 없는 이유는 무엇입니까 ?

(심볼릭 링크가 아니라고 가정하면) 아무런 차이가 없어야 하므로 dir1이는 정상입니다.

관련 정보