왜 유닉스 mv 프로그램이 디렉토리에 대해 -R (재귀) 옵션이 필요하지 않지만 cp가 필요합니까?


58

사용해야 할 때 나는 항상 엉망 cp또는 mv"내가 필요합니까 -R? 디렉토리로 작업 할 때 옵션을" GNU coreutils cp에는 필요 -R하거나 필요 mv하지 않습니다.

나는 dirs를 복사하기위한 옵션이 cp필요한 이유를 찾을 수 없지만 그렇지 않습니다. 나는 생각 없이 DIRS을 보내고 (하지만이처럼 반복적으로 행동 하고 좋아 하는 일은) 도구를 사용하여 사람의 습관을 깨는 제외하고 문제가 발생하지 않을 것입니다.-Rmvcp-R-Rmv

당신은 어떤 설명을 알고 있습니까? 오래 전에 이유가 있었을 수 있습니까?


추가 질문 : 왜 coreutils 개발자 cp가 기본적으로 복사 디렉토리를 재귀 적으로 작성하지 않습니까?

답변:


45

디렉토리는 개념적으로 이름 목록과 해당 이름이 가리키는 inode 번호를 포함하는 특수한 "파일"입니다. 일부 이름은 하위 디렉토리 일 수 있습니다. ..부모 디렉토리를 가리키는 특별한 항목 이 있습니다.

따라서 파일 이름을 명확하게 변경하는 것은 쉽습니다. 디렉토리 항목의 이름 만 변경하면됩니다. 파일이 실제로 파일인지 또는 다른 디렉토리의 내용을 저장하는 데 사용되는 "파일"인지 여부를 유지합니다. 실제로 동일한 renamesyscall이 둘 다 수행합니다.

그러나 복사는 훨씬 덜 간단한 작업입니다. 당신은 할 수 단지 디렉토리 "파일을"복사,하지만 당신은 파일 (그들은 하드 링크 것) 동일한 두 개의 디렉토리가 것입니다. 디렉토리에 대한 하드 링크를 허용하는 시스템이 있다면, 그렇게 할 수 있지만, 최신 시스템에서는 루트가 아닌 루트를 허용하지 않으므로 각 서브 디렉토리에 대해 해당 사본을 작성해야합니다. 당신은 실제로 요청할 수 있습니다 cp이 행동 cp -lR: -l하드 링크, -R그 재귀하십시오.

그러나 모든 것을 연결된 상태로 두는 것은 당신이 원하는 것이 아닐 것입니다. 대신 cp각 파일을 복사 하려고 합니다. 상당히 비싼 작업입니다. 각 파일을 메모리로 읽고 두 번째 위치에서 디스크에 다시 써야합니다. 실제로 파일을 열고, 읽고, 쓰고, 닫으려면 몇 번의 syscall이 필요하며 각 파일마다 반복해야합니다.

전통적인 파일 시스템도 디스크에서 이런 방식으로 작동합니다. 각 파일을 개별적으로 복사하여 복사하는 것 외에 여러 파일을 복사하는 방법은 없으며 기본 명령 줄 유틸리티를 디자인 할 때 사용 된 파일 시스템 유형입니다.


있다 mv"디렉토리 항목에 단지 변경 이름"다른 하나의 파일 시스템에서 동일하게 보내고?
rslnx

5
크로스 파일 시스템은 복사 + 삭제와 동일합니다 (실제로 rename크로스 파일 시스템의 경우 syscall이 실패합니다). 역사적으로 mv지원되는 크로스 -FS 이동 인지 확실하지 않습니다 .
derobert

9
나는 직접 경험에서 추측 mv하지 않고 고전 이 교차 장치 이동을 지원하지 않았다고 말할 수 있습니다 . 그것은 rename()실패했을 때 오류 메시지를 인쇄하고 인쇄하는 데 사용되었습니다 . 새로운 기능을 실수로 처음 사용했을 때의 충격을 기억합니다. 이 mv가 왜 그렇게 오래 걸립니까? 아, 내가 의도하지 않은 재귀 복사를하고 있습니다!
Alan Curry

5
@RuslanKhusnullin 일반적인 명령에 대한 명령 줄 옵션은 셸 스크립트에서 사용하기 때문에 변경하기가 매우 어렵습니다. 누군가 현재 cp의 복사 거부 명령 동작에 의존 할 수 있습니다. cross-fs는 아마도 파손을 일으킬 가능성이 적은 것으로 판단되었지만, Alan은 여전히 ​​놀랐습니다.
derobert

1
@derobert, 그렇지 않았습니다 (크로스 파일 시스템 mv은 VAX의 BSD 4.2의 개별 파일에 대해서만 작동했습니다).
vonbrand

21

다른 질문을하면서 시작하겠습니다 :

차이점은 무엇이며 cp그리고 cp -R?

-R플래그가 없으면 파일을 복사하는 것이 가능합니다. 누군가가 재귀 적으로 디렉토리를 복사하지 않으려는 경우가 드물기 때문입니다. 구조. 그것이 사람들이 원하는 ln것은 아니며, 실제로 이것을 수행하는 별도의 프로그램이 있기 때문에 ( 비재 귀적) 디렉토리의 사본은 허용되지 않습니다.

그렇다면 mv과 의 차이점은 무엇입니까 mv -R?

mv a b디렉토리에서 단일 항목의 이름 만 바꾸면 디렉토리가 mved이면 해당 내용도 자동으로 이동합니다. 그런 의미에서, mv이미 재귀 적 속성을 제공으로부터 예를 들어, 이름이 디렉토리에있는 모든 항목의 "이름 바꾸기"즉, a/1b/1. mv, 즉 디렉토리 이름을 변경하는 그렇게하지 않습니다 a에를 b하지만, 유지 a/1a/1, 그들이 뭔가를 이동를 참조 할 때 사람들이 이해하는 것이 아니다 : 당신이 찬장을 이동하는 경우는, 찬장의 내용도 이동됩니다. 내용없이 디렉토리를 이동하는 다른 작업도 이미 사용 가능합니다 mkdir.


2
그건 그냥 생각하고 있었는데, 바로 cpmv'복사본을 만들어'와 '이동'그들이 이름을 지정하는 것을 운영한다. 따라서 커피 한 잔을 만들고 싶다면 같은 충전재 (커피 음료)로 커피 한 잔을 더 마실 것입니다. 문제는이 도구가 '일반적인 사람들'을위한 것이 아니라 파일 및 파일과 같은 가상 엔티티가 아닌 디스크 및 파일 시스템 구조를 알고있는 괴상한 사람들을위한 것입니다.
rslnx

1
체계적이고 합리적인 응답.
Spedge

1
@RuslanKhusnullin 커피 비유는 cp물론 효과 mv도 있습니다. 기본적인 상식을 이해하기 위해 어떤 수준의 "순도"도 필요하지 않습니다. 커피 한 잔의 실제 사본은 빈 컵이 아닙니다. 컵뿐만 아니라 모든 내용물 (커피)도 재귀 적으로 복사해야합니다. 그러나 커피 한 잔을 옮길 때 내용물을 따로 옮길 필요가 없습니다. 내용물은 컨테이너와 자연스럽게 움직입니다.
jw013

1
@ jw013 "커피를 옮길 때 내용을 따로 옮길 필요가 없습니다"라는 말에 깊은 인상을 받았습니다. 정말 말이됩니다. 감사합니다. 그러나 이것은 또 다른 추상화 계층입니다. 메타 정보가없는 바이트 시퀀스와 같은 파일을 생각하면서 "파일을 inode로 처리"를 의미한다고 생각합니다.
rslnx

6

일반적으로 유닉스 로직을 망 쳤을 때 나는 Plan9를보고 유닉스 발명자들이 몇 년 후 이전 버전과의 호환성을 유지하면서 어떻게 동일한 작업을 구현했는지 살펴 봅니다.

따라서 Plan9는 파일로만 작동하는 도구 cpmv툴을 제공 합니다.

`cp f1 f2` creates f2 and copies f1's contents into it.
`mv f1 f2` renames f1 to f2 if f1 and f2 are in the same dir
           does `cp f1 f2 && rm f1` else
           can rename dirs (`mv d1 d2`) but will not move dir to another dir.

디렉토리를 복사하기 위해 dircp실제로는 @{cd fromdir && tar c .} | @{cd todir && tar xT}(rc 셸 구문)

디렉토리를 이동하기 위해 나는 단지 dircp d1 d2 && rm -r d1

파일 작업 만 제한 cp하고 mv(디렉이 아님) 이 결정 은 디스크 작업을 더 명확하게하고 tar파일 트리 복사에 사용 하는 것은 이해하고 스크립팅에 매우 편안하다고 생각합니다.

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