rmdir(1) 和 rm(1) 共存的原因是什麼?

rmdir(1) 和 rm(1) 共存的原因是什麼?

我每天都使用 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 開關來進行遞歸刪除。原因是歷史性的:unlinkrmdir是獨立的系統調用,並且來自 Unix 的早期。

答案3

另外 rmdir 僅刪除空的目錄。如果您想確保不刪除目錄中的任何其他文件,則比(除非您使用別名 rm 以便始終需要確認刪除的內容,即在 ~/.bashrc 或您正在使用的任何文件中)rmdir更安全rm -ralias rm='rm -i'

答案4

此外,也rmdir可以輕鬆刪除帶有通配符(通配符)表達式的空目錄。例如,要刪除所有空目錄/tmp而不觸及任何包含內容的檔案或目錄:

cd /tmp ; rmdir *

相關內容