我每天都使用 BSD 和 Linux,從來沒有遇到過必須使用 rmdir(1) 而不是 rm(1) 的情況。 rmdir存在的目的為何?
答案1
主要原因可能是歷史原因。回到過去,沒有rmdir(2)
系統mkdir(2)
呼叫(我們在這裡討論第七版 UNIX™),並且rmdir(1)
(必須)是一個 SUID 根程序,它使用unlink(2)
系統呼叫來刪除目錄。
第 7 版 UNIX 手冊可線上取得:http://cm.bell-labs.com/7thEdMan(最後檢查2017-04-23);它們也可以在http://plan9.bell-labs.com/7thEdMan(最後檢查時間為 2017 年 4 月 23 日)。網路上似乎還至少有一種替代來源——http://wolfram.schneider.org/bsd/7thEdManVol2/— 對於第 2 卷中的文章,包含指向自由BSD第 1 卷中的命令和系統呼叫的站點。
該rm
命令(常規非 SUID 程式)會呼叫該rmdir(1)
命令來刪除空目錄。它自己無法做到這一點;這需要 root 權限。所以,rmdir(1)
命令(參見這裡對於 Unix V7 中的原始程式碼)存在刪除空目錄的功能,且該rm
指令本身並不會刪除空目錄。
要用於rm
刪除目錄,您必須給出該-r
選項。
還有一個對稱性論證。您需要一個命令mkdir(1)
來建立目錄;有一個命令rmdir(1)
來撤消mkdir(1)
所做的事情似乎是合理的。另外,它們(現在)是rmdir(2)
和mkdir(2)
系統調用的簡單執行者 — 是的,早在第七版 UNIX 中,mkdir(1)
也是一個 SUID 根程序,使用mknod(2)
創建目錄節點的調用和在目錄中和link(2)
創建.
..
答案2
“rm”不適用於目錄。您必須使用 rmdir 或指定 -r 開關來進行遞歸刪除。原因是歷史性的:unlink
和rmdir
是獨立的系統調用,並且來自 Unix 的早期。
答案3
另外 rmdir 僅刪除空的目錄。如果您想確保不刪除目錄中的任何其他文件,則比(除非您使用別名 rm 以便始終需要確認刪除的內容,即在 ~/.bashrc 或您正在使用的任何文件中)rmdir
更安全rm -r
alias rm='rm -i'
答案4
此外,也rmdir
可以輕鬆刪除帶有通配符(通配符)表達式的空目錄。例如,要刪除所有空目錄/tmp
而不觸及任何包含內容的檔案或目錄:
cd /tmp ; rmdir *