'cp -r srcpath/..dstpath'는 무엇을 해야 합니까?

'cp -r srcpath/..dstpath'는 무엇을 해야 합니까?

다음을 고려하세요:

/tmp$ mkdir -p src/{a,b} dst/dstsub; touch src/{a,b}/hello
/tmp$ tree src/ dst/
src/
├── a
│   └── hello
└── b
    └── hello
dst/
└── dstsub

지금 달려라

/tmp$ cp -r src/a/.. dst/dstsub/

srcGNU cp를 사용하면 다음과 같이 ==의 내용이 src/a/..에 복사 됩니다 dst/dstsub.

/tmp$ tree dst/
dst/
└── dstsub
    ├── a
    │   └── hello
    └── b
        └── hello

그러나 Busybox를 사용하여 이 연습을 반복하면 목표 구조가 달라집니다.

/tmp$ rm -r dst/; mkdir -p dst/dstsub
/tmp$ busybox cp -r src/a/.. dst/dstsub/
/tmp$ tree dst/
dst/
├── a
│   └── hello
├── b
│   └── hello
└── dstsub

src여기서 소스 디렉터리 ==의 내용이 src/a/..복사됩니다.옆에dst/dstsub/대신 대상 디렉토리존재하다그것.

표준 텍스트를 읽어보세요.

 cp -R [-H|-L|-P] [-fip] source_file... target

[...] cp 유틸리티는 각 파일을 루트로 하는 파일 계층 구조의 각 파일을 복사해야 합니다.소스 파일이름이 지정된 대상 경로로:

만약에표적기존 디렉터리가 존재하고 이름이 지정되며 파일 계층의 각 파일에 해당하는 대상 경로의 이름이 연결되어야 합니다.표적, 하나의<슬래시>문자의 경우표적다음으로 끝나지 않습니다<슬래시>및 포함된 디렉토리에 상대적인 파일의 경로 이름소스 파일.

표적is 는 dst/dstsub/슬래시로 끝나는 기존 디렉터리입니다.소스 파일is src/a/..이므로 이를 포함하는 디렉토리는 is src/a/이고 이를 포함하는 디렉토리에 상대적인 경로 이름은 etc. 이며 ../a, 이는 Busybox의 동작과 일치하는 대상 ../b경로 etc. 가 됩니다 .dst/dstsub/../adst/dstsub/../b

그러나 삭제할 소스 경로를 먼저 정규화하면 ..삭제됩니다 src/(또는 오히려 생성될 때 발생하는 것처럼 자체적으로 복사되지 않기 src/.때문에 오히려 )가 됩니다. 결과적으로 GNU cp의 기능과 일치하는 것으로 보이는 와 같은 대상 경로가 생성됩니다. (그럴지는 모르겠지만 일리가 있는 설명인 것 같습니다.)srccp -r src dstdst/srcdst/dstsub/./a

언급된 유일한 것은 ..(피어 투 피어)는 특별합니다. 표준 텍스트에 표시되는 내용은 다음과 같습니다.

 2. 만약에소스 파일디렉터리 유형인 경우 다음 단계를 수행해야 합니다.

b.만약소스 파일피연산자로 지정되지 않았으며소스 파일가리키다또는피어 투 피어, cp는 더 이상 아무것도 하지 않습니다.소스 파일나머지 파일을 계속 처리합니다.

..포함된 경로가 명령줄 피연산자로 명시적으로 제공되기 때문에 이는 적용되지 않습니다 . 또한 만약을 대비해 피연산자가 정확하게 존재하지는 않지만 ..GNU와 Busybox 모두의 소스 디렉터리에서 ..동일한 결과를 얻습니다.

/tmp$ cd src/a/
/tmp/src/a$ cp -r .. /tmp/dst/dstsub/

..표준은 위의(또는 동등한 동작)의 정규화를 허용합니까? 꼭 해야 할까요? 해야한다아니요완성된? 아니면 GNU cp의 동작이나 표준 텍스트의 해석과 관련하여 제가 누락한 것이 있습니까?

관련 정보