왜`cp`와`rm`은 디렉토리를 개별적으로 취급합니까?


10

도구 가 일반 파일 cprm별도로 디렉토리를 좋아 하고 취급하는 이유는 무엇 입니까? 둘 다 사용자에게 재귀 동작을 원한다고 명시 적으로 지정해야하며 그렇지 않으면 디렉토리를 전혀 다루지 않습니다.

컴퓨터와의 첫 번째 상호 작용 (이전)은 Windows / GUI / 포인트 앤 클릭 / 드래그 앤 드롭 환경에서 수행되었으므로 대상에 관계없이 이러한 작업이 항상 동일하게 작동하는 것은 항상 자연스러운 것처럼 보였습니다.

이 동작은 와일드 카드를 사용하여 명령을 제공 할 때 특히 실망합니다. 비어 있지 않은 하위 디렉토리를 *제외하고 디렉토리 ( ) 에서 모든 것을 제거하려면 어떻게해야 합니까?

나는 이것이 사용자가 발로 자신을 쏘지 못하게하는 일종의 보안 기능이라고 상상할 수 있지만 이것은 유닉스 원칙에 대한 나의 이해와 모순됩니다.

  • 유닉스는 일반적으로 사용자를 자신으로부터 보호하지 않습니다. 항상 사용자가 자신이하는 일을 알고 있다고 가정했습니다.
  • 유닉스의 경우 모든 것이 파일입니다. 디렉토리가 다른 파일이 아닌가? 그들은 왜 다르게 취급됩니까?

내 질문 :

  • 이 동작은 기술적 인 한계에서 비롯된 것일까 요 아니면 의도적 인 선택입니까?

후자의 경우

  • 이 선택에 동기를 부여한 이유에 대한 역사적 설명이 있습니까?

들어 rm적어도 당신이 원하는 경우 파일 및 디렉토리의 차이를 무시, 당신은 당신에 넣을 수 있습니다 ~/.bashrc파일 : alias rm='rm -r'.
BenjiWiebe


1
cp 및 rm을 Windows 파일 관리자와 비교할 수 없습니다. cmd.exe를 시작하고 복사 및 삭제를 시도하고 동작을 비교하십시오.
ott--

답변:


11

Derobert 's 왜 unix mv 프로그램에 디렉토리에 대해 -R (재귀) 옵션이 필요하지 않지만 cp에는 필요합니까? 기본적으로 귀하의 질문에 대답합니다 : 일반 파일을 복사하거나 제거하는 것은 디렉토리에 포함 된 모든 파일을 처리해야하기 때문에 디렉토리와 동일한 작업을 수행하는 것과 다릅니다. 따라서 작업이 근본적으로 다릅니다.

또한 rmdir빈 디렉토리에서만 작동 할 수 있는 특별한 유틸리티가 있다는 점도 주목할 가치가 있습니다. 사실을 확인하지 않으면 원래 rm디렉토리가 아닌 디렉토리 만 제거 할 수 있었고 rm빈 디렉토리를 재귀 적으로 사용하여 제거하고 깊은 제거를 수행해야 한다는 결론을 내릴 수 있습니다 rmdir.


rmdir또한 디렉토리를 삭제하는 데 사용 된 시스템 호출의 이름입니다. 시스템 호출을 위해 디렉토리가 비어 있어야하며 동일한 이름의 unlink유틸리티 는 명령 및 유틸리티와 유사하게 "프론트 엔드" 입니다.
jordanm

정확히 말해서, 원래 rm명령 줄 유틸리티가 종종 syscall 주위의 비교적 단순한 래퍼이기 때문에 디렉토리를 전혀 제거하지 못했을 수도 있다고 믿게 되었습니다.
peterph

내 질문의 제목은 기술적 세부 사항에 대해 묻는 것이라고 오도 할 수 있습니다. 나는 그것이 고의적 인 선택인지 묻고 있었다. 최종 사용자 관점에서이 동작이 일관성이 없다고 생각하는 유일한 사람인지 궁금합니다. 내 질문에 간접적으로 대답하기 때문에 귀하의 답변을 수락합니다. (syscall 수준의 Unix 내부의 기술적 한계는이 동작의 기원 인 것으로 보이며, 레거시로 인해 오늘날 다른 방법으로는 수행하지 못할 수 있습니다. "시스템 콜을 둘러싼 간단한 래퍼"가 더 지능적인 동작을 제공하지 않습니까?
rahmu

2
최종 사용자 POV에서는 실제로 이상하게 보이지만 실제로 그 이유에 대해 묻고있었습니다. :) 래퍼에 관해서는-모두 "간단한"상태와 여전히 "간단한"이라고 부르는 것에 달려 있습니다. 현대 rm는 단순히 단순한 래퍼가 아닙니다 (한 번에 mroe 파일과 디렉토리를 제거 할 수 있음). -r옵션을 제공하지 않으 려면 쉘의 앨리어싱 기능을 사용하거나 자신의 래퍼를 만들어서 배치하십시오 (느리지 만 사용중인 쉘과는 무관).
peterph

2

일부 UNIX 특징에서 rm의 man 페이지는 파일을 링크 해제하는 명령으로 지정합니다.
UNIX에서 파일은 파일 시스템의 ID와 별개로 이름이나 위치가없는 Inodes라는 파일 시스템의 객체입니다. 이들의 이름은 다양한 디렉토리에서 참조되며, 파일에 나열된 파일 (또는 파일이므로 디렉토리)을 색인화하는 파일 유형입니다.
파일을 링크 해제 할 때 파일의 참조 횟수가 감소하고 0에 도달하면 파일 시스템에 의해 사용 가능으로 표시되고 블록 / 확장자도 사용 가능으로 표시되므로 실제로 삭제됩니다.

파일을 먼저 링크 해제하지 않고 디렉토리를 rm 할 수있는 경우 파일 시스템에서 inode가 참조되었지만 정상적인 방법으로는 액세스 할 수없는 지점에 도달합니다.
참조 횟수에 따라 참조가 있으므로 삭제 된 것으로 표시되지 않고 파일이 손실됩니다.
손실 된 "파일"이 디렉토리 인 경우 훨씬 복잡해 지므로 파일 시스템에서 스토리지 손실 가능성이 증가합니다.

따라서 rm -r은 표준 "UNIX spirit"을 희생시키면서 UNIX 사용자의 삶을 편하게하는 기능으로 디렉토리로 내려 가서 파일을 제거 할 때 기존 UNIX 유틸리티보다 더 복잡하므로,

또한 UNIX 초기에는 시스템에 메모리가 많지 않았으며 디렉토리의 재귀 구조를 매핑하면 성능이 저하되어 작업을 분할하지 않고 수행 할 수없는 경우가있었습니다.

cp는 파일을 읽고 블록별로 복사합니다. 디렉토리가 파일과 동일한 디렉토리를 복사하는 경우 참조 횟수를 늘리지 않고 파일에 참조를 추가하여 데이터가 일치하지 않을 수 있습니다 (이후 블록이 비어있는 것으로 표시된 블록을 읽거나 쓰는 경우 파일에 대한 마지막 (알려진) 참조를 삭제하면 inode 번호가 재활용 될 수 있으므로 원래 inode가 삭제됨), 데이터 손실 됨

tl; dr crowd :
UNIX의 디렉토리는 파일 유형이지만 사실은 파일 시스템의 메타 데이터이므로 파일 정보는 시스템에 따라 다르게 처리되므로 파일을 조작하는 명령은 디렉토리가 없으면 디렉토리에서 작동 할 수 없습니다 종속 메타 데이터를 조작하기위한 동작 변경.

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