`cp`와 `rm`이 디렉토리를 별도로 처리하는 이유는 무엇입니까?

`cp`와 `rm`이 디렉토리를 별도로 처리하는 이유는 무엇입니까?

도구가 디렉터리를 일반 파일과 별도로 처리하는 cp이유 는 무엇입니까 ? rm둘 다 사용자가 재귀적 동작을 원한다는 것을 명시적으로 지정해야 합니다. 그렇지 않으면 디렉터리를 전혀 처리하지 않습니다.

컴퓨터와의 첫 번째 상호 작용(얼마 전)은 Windows/GUI/클릭/드래그 앤 드롭 환경에서 이루어졌으며 이러한 작업이 대상에 관계없이 동일하게 작동하는 것이 항상 자연스러워 보였습니다.

이 동작은 특히 와일드카드를 사용하여 명령을 실행할 때 실망스럽습니다. *디렉토리( )에서 다음을 제외한 모든 항목을 삭제하려면 어떻게 해야 합니까?비어 있지 않은 하위 디렉터리?

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

  • Unix는 일반적으로 사용자를 자체적으로 보호하지 않습니다. 항상 사용자가 자신이 무엇을 하고 있는지 알고 있다고 가정합니다.
  • 유닉스에서는 모든 것이 파일이다. 디렉토리는 또 다른 파일이 아닌가? 왜 그들은 다르게 취급됩니까?

내 질문:

  • 이 동작은 기술적 한계로 인해 발생합니까, 아니면 의도적인 선택입니까?

후자라면,

  • 이 선택을 촉발한 역사적 기록이 있습니까?

답변1

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

rmdir빈 디렉토리에서만 작동하는 특수 유틸리티가 있다는 점도 주목할 가치가 있습니다 . 사실을 확인하지 않으면 처음에는 디렉터리가 아닌 디렉터리만 삭제할 수 있으며 빈 디렉터리를 rm사용하여 반복적으로 작업한 rm다음 해당 디렉터리를 삭제하여 전체 삭제를 rmdir수행 해야 한다는 결론을 내릴 수 있습니다 .

답변2

일부 UNIX 버전에서는 rm의 매뉴얼 페이지에서 이를 파일 링크 해제 명령으로 지정합니다.
UNIX에서 파일은 파일 시스템의 ID 외에는 이름이나 위치가 없는 inode라고 하는 파일 시스템의 개체입니다. 해당 이름은 해당 디렉터리에 대한 참조입니다. 디렉터리는 해당 디렉터리에 나열된 파일(또는 파일이므로 디렉터리)을 색인화하는 파일 형식입니다.
파일이 연결 해제되면 파일의 참조 횟수가 감소하고 0에 도달하면 파일 시스템에 의해 사용 가능으로 표시되고 해당 블록/범위도 사용 가능으로 표시되므로 실제로 삭제됩니다.

먼저 파일 링크를 해제하지 않고 디렉토리를 관리할 수 있다면 파일 시스템에서 inode가 참조되지만 일반적인 방법으로는 액세스할 수 없는 지점에 도달한 것입니다.
참조 횟수에 따라 참조되기 때문에 삭제 표시가 되지 않고 누락된 파일이 됩니다.
누락된 "파일"이 디렉터리인 경우 상황은 더욱 복잡해지며, 따라서 파일 시스템에서 손실된 저장소의 양이 늘어납니다.

따라서 rm -r은 UNIX 사용자의 생활을 편하게 하기 위한 기능으로 추가되었지만 표준 "UNIX 정신"을 희생했습니다. 이는 디렉토리에 드롭다운되므로 기존 UNIX 유틸리티보다 더 복잡하기 때문입니다. 문서를 삭제하고,

또한 UNIX 초기에는 시스템에 메모리가 많지 않았고 매핑된 디렉터리의 반복적 구조로 인해 성능 저하가 발생했으며 때로는 작업을 분할하지 않으면 작업을 완료할 수 없었습니다.

cp, 파일을 읽고 블록 단위로 복사합니다. 파일과 같은 디렉토리를 복사하는 경우 참조 카운트를 증가시키지 않고 파일에 대한 참조를 추가하므로 데이터 불일치가 발생할 수 있습니다(해당 블록이 사용 가능으로 표시되어 있는 inode를 읽고 쓰는 경우). 무료로). 원본 inode가 삭제됨), 데이터 손실 - 파일에 대한 마지막(알려진) 참조를 삭제하면 해당 inode 번호가 재활용될 수 있기 때문입니다.

tl;dr 군중의 경우:
UNIX의 디렉토리는 파일 형식인 것은 사실이지만 디렉토리에 포함된 정보는 파일 시스템의 메타데이터이기 때문에 시스템에서 다르게 처리되므로 파일에 대해 작동하는 명령은 디렉토리의 작동 방식을 변경하지 않고는 디렉토리에서 실행할 수 없습니다. 행동. 및 종속성 메타데이터.

관련 정보