mv 유틸리티에는 -R(재귀) 옵션이 필요하지 않지만 cp에는 필요한 이유는 무엇입니까?

mv 유틸리티에는 -R(재귀) 옵션이 필요하지 않지만 cp에는 필요한 이유는 무엇입니까?

cp나는 or를 사용할 때 항상 혼란스럽다 mv: " -Rdir을 사용할 때 옵션이 필요한가?" GNU coreutils에서는 cp실제로 필요 -R하지만 필요하지 않습니다 mv.

디렉토리 복사 옵션이 cp필수 이고 필수가 아닌 이유를 찾을 수 없습니다 . 나는 dirs 없이 (그러나 There's 및 like 처럼 재귀적으로 동작하는 ) 것이 누군가의 해당 도구 사용 습관을 깨뜨리는 것 외에 다른 문제를 일으킬 것이라고 생각하지 않습니다 .-Rmvcp-R-Rmv

혹시 설명 아시나요? 오래전부터 이유가 있었겠죠?


추가 질문:cpcoreutils 개발자가 기본적으로 디렉터리를 반복적으로 복사하지 않는 이유는 무엇입니까?

답변1

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

따라서 파일 이름을 변경하는 것이 쉽다는 것은 명백합니다. 디렉토리 항목에서 이름만 변경하면 됩니다. 파일이 실제로 파일인지, 아니면 다른 디렉터리의 내용을 저장하는 데 사용되는 "파일"인지 저장합니다. 실제로 동일한 rename시스템 호출로 두 가지 작업을 모두 수행할 수 있습니다.

그러나 복사는 그리 간단하지 않은 작업입니다. 너할 수 있다"files" 디렉터리를 복사하면 동일한 파일이 포함된 두 개의 디렉터리가 생성됩니다(하드 링크). 디렉토리 하드 링크를 허용하는 시스템이 있다면 그렇습니다. 그러나 최신 시스템에서는 이를 허용하지 않기 때문에 적어도 루트가 아닌 경우에는 각 하위 디렉토리에 대해 해당 복사본을 만들어야 합니다. 실제로 하드 링크, 재귀의 경우 :을 cp사용하여 이 동작을 요청할 수 있습니다 .cp -lR-l-R

그러나 모든 것을 연결된 상태로 유지하는 것은 원하는 것이 아닐 수도 있습니다. 대신 cp모든 파일을 복사 하려고 합니다 . 이는 상당히 비용이 많이 드는 작업입니다. 각 파일을 메모리로 읽어온 다음 디스크의 두 번째 위치에 다시 써야 합니다. 파일을 열고, 읽고, 쓰고, 닫기 위해서는 실제로 여러 시스템 호출이 필요하며 이러한 작업은 각 파일에 대해 반복되어야 합니다.

기존 파일 시스템도 디스크에서 이러한 방식으로 작동합니다. 각 파일을 개별적으로 확인하고 복사하는 것 외에는 여러 파일을 복사할 수 있는 방법이 없으며 이는 기본 명령줄 유틸리티가 사용하도록 설계된 파일 시스템 유형입니다.

답변2

먼저 다른 질문을 드리겠습니다.

cp이들그리고 그리고 의 차이점은 무엇인가요 cp -R?

글쎄, 해당 플래그가 없으면 -R파일만 복사할 수 있습니다. 누군가가 디렉토리를 비재귀적으로 복사하려는 경우는 매우 드물기 때문입니다. 비재귀적 복사는 디렉토리에 대한 두 번째 이름을 생성하고 동일한 디렉토리를 직접 가리킵니다. 구조. 이는 원하는 경우가 거의 없고 실제로 이를 수행하는 별도의 프로그램( )이 있기 때문에 ln디렉토리의 비재귀적 복사본은 허용되지 않습니다.

mv그럼 와 의 차이점은 무엇인가요 mv -R?

mv a b디렉토리에 있는 단일 항목의 이름을 바꾸면 디렉토리가 mv편집되면 해당 내용도 자동으로 이동됩니다. 이러한 의미에서 mv재귀 속성이 제공되었습니다. 즉, "이름 바꾸기"는 디렉토리의 모든 항목 이름을 변경합니다(예: from 에서 a/1) b/1. mv이를 수행하지 않는 A, 즉 디렉토리 이름을 a로 변경 b하고 그대로 두는 a/1것은 a/1사람들이 무언가 이동을 언급할 때 이해하는 것이 아닙니다. 캐비닛을 이동하면 캐비닛의 내용도 이동됩니다. 내용이 포함되지 않은 디렉토리를 이동하는 또 다른 작업도 이미 사용 가능하며 이를 호출합니다 mkdir.

답변3

일반적으로 저는 Unix 로직을 망칠 때 Plan9를 보고 Unix 발명가들이 몇 년 후 이전 버전과의 호환성을 주장하지 않고 동일한 작업을 어떻게 달성했는지 확인합니다.

따라서 Plan9은 파일에서만 작동하는 도구를 제공합니다 cp.mv

`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파일 트리 복사를 이해하고 스크립트하기 매우 편안하게 만든다고 생각합니다 .

관련 정보