rmdir (1)과 rm (1)이 공존하는 이유는 무엇입니까?


17

나는 매일 BSD와 리눅스를 사용하고 있지만, 나는 rm (1)보다는 rmdir (1)을 사용해야하는 상황이 없었다. rmdir 존재의 목적은 무엇입니까?


2
OT, 그러나 FWIW, 이것은 흥미로운 (그리고 다른) 사용법을 보여줍니다 : cyberciti.biz/faq/linux-unix-remove-directory
pst

답변:


27

주된 이유는 아마도 역사적인 것입니다. 옛날에는 시스템 호출 이 없었 rmdir(2)으며 mkdir(2)(여기에서는 7 판 UNIX ™에 대해 설명하고 있음), 시스템 호출을 rmdir(1)사용하여 unlink(2)디렉토리를 제거 하는 SUID 루트 프로그램이 필요했습니다 .

7 판 UNIX 설명서는 http://cm.bell-labs.com/7thEdMan 에서 온라인으로 볼 수 있습니다 (최종 확인 2017-04-23). 또한 http://plan9.bell-labs.com/7thEdMan (최종 확인 2017-04-23) 에서도 제공됩니다 . 볼륨 1의 명령 및 시스템 호출을위한 FreeBSD 사이트 링크가있는 볼륨 2의 기사에 대해서는 온라인 ( http://wolfram.schneider.org/bsd/7thEdManVol2/)에 온라인으로 하나 이상의 대체 소스가있는 것 같습니다. .

rm명령 (일반 비 SUID 프로그램) 호출 된 rmdir(1)빈 디렉토리를 제거 명령을 사용합니다. 그것은 스스로 할 수 없었습니다. 루트 권한이 필요했습니다. 따라서이 rmdir(1)명령 ( 여기서는 Unix V7의 소스 코드는 여기 참조 )이 비어있는 디렉토리를 제거 rm하고 빈 디렉토리 자체는 제거하지 않았습니다.

rm디렉토리를 제거 하는 데 사용하려면 -r옵션 을 제공해야합니다 .

대칭 인수도 있습니다. mkdir(1)디렉토리를 작성 하려면 명령이 필요합니다 . 수행 한 작업 rmdir(1)을 취소 하라는 명령 을받는 것이 합리적 mkdir(1)입니다. 게다가 그들은 요즘의 간단한 시스템 호출 rmdir(2)mkdir(2)시스템 호출입니다. 예, UNIX 7th Edition으로 돌아가서 디렉토리 노드를 생성하는 호출 과 디렉토리에 항목 을 생성하는 호출을 mkdir(1)사용하는 SUID 루트 프로그램이었습니다. .mknod(2)link(2)...


아하! 이 모든 것이 의미가 있습니다.

2
좋은. 방금 내가 가지고있는 3BSD의 사본을 확인했으며 거기에 rmdir syscall에 대한 문서가 없으며 rmdir (1)은 여전히 ​​unlink를 사용하여 구현됩니다.
Andy Ross

4
mknod + 링크 및 링크 해제 시스템의 한 가지 주요 단점은 디렉토리 작성이 원 자성 작업이 아니므로 부분적으로 완전한 디렉토리로 끝날 수 있다는 것입니다. 불일치가 발생했는지 파일 시스템을 검사하기 위해 고안된 많은 프로그램이있었습니다. fsck(1)살아남은 것입니다.
Jonathan Leffler

@Jonathan, Xenix의 추억을 다시 불러옵니다. 왝! 정말 나쁜 일이 생길 수 있습니다.
Fiasco Labs

6

"rm"은 디렉토리에서 작동하지 않습니다. 재귀 삭제를 위해서는 rmdir을 사용하거나 -r 스위치를 지정해야합니다. 그 이유는 역사입니다 : unlinkrmdir별도의 시스템 호출이며, 유닉스의 초기부터 있었다.


4
행복한 부작용은 파일 만 제거하려고 할 때 실수로 디렉토리를 삭제할 가능성이 적다는 것입니다.

감사합니다. "rm -r"과 "rmdir"의 키 스트로크 양은 동일합니다. rmdir은 역사적 이유로 순수하게 존재합니까 (.. 수십 년 전의 유닉스 프로그램과 호환 가능)

2
실제로 유닉스 초기 에는 시스템 호출로 존재 rmdir(2)하거나 mkdir(2)존재 하지 않았다 . 사용자 rootmknod(2)호출을 사용하여 디렉토리 노드를 작성 하고 호출을 사용하여 디렉토리 link(2)...항목 을 작성할 수 있습니다 . 및 root사용을 할 수 unlink(2)있는 디렉토리 항목을 제거하기 위해 전화를.
Jonathan Leffler

3

또한 rmdir은 디렉토리 만 제거합니다 . 디렉토리에서 추가 파일을 삭제하지 않으려면 (//.bashrc 또는 사용중인 모든 파일에서 항상 삭제 대상을 확인 해야하는 rm을 별칭으로 지정한 경우를 제외하고 rmdir)보다 안전 합니다. ).rm -ralias rm='rm -i'


1

또한 글 rmdir로빙 (와일드 카드) 표현식으로 빈 디렉토리를 쉽게 제거 할 수 있습니다. 예를 들어, /tmp내용이있는 파일이나 디렉토리를 건드리지 않고 빈 디렉토리를 모두 제거하려면 다음을 수행하십시오 .

cd /tmp ; rmdir *

사용을 고려하십시오 rmdir /tmp/*. /tmp디렉토리가 실제로 큰 경우 이름 당 추가 5 문자로 인해 인수에 대한 공간이 약간 더 빠를 수 있지만 cd디렉토리 계층 구조로 이동할 필요는 없습니다 . 또한 rmdir /tmp/* 2>/dev/null오류 메시지가 표시되지 않도록 고려할 가치가 있습니다 (일반적으로 많은 메시지가 표시되며 거의 모든 작업이 해당 작업과 관련이 없음).
Jonathan Leffler 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.