你會使用 unlink 刪除文件嗎?
在 Linux 中刪除文件,我們通常使用 rm 命令。除此以外,還有另外一個命令,可以用于刪除文件和鏈接,這就是 unlink 命令。雖然它聽起來像是只能刪除 Linux 系統中的鏈接,但實際上,也可以刪除文件。
Linux 系統中刪除文件的過程是非常迅速的,只是一瞬間。當你刪除文件時,Linux 內核發現它對應于索引節點編號 X,系統會將其從目錄列表中刪除文件條目,并將索引節點 X 的鏈接計數減少1,這時候,索引節點 X 的鏈接計數為0,內核會認為沒有人鏈接到此索引節點,所以就可以安全的刪除索引節點,并刪除與其關聯的數據塊。
現在我們來看一下如何使用 unlink 命令。
unlink 命令
如前文所述,unlink 命令用于刪除文件和鏈接,其中鏈接包括軟鏈接和硬鏈接。它是最簡單的命令之一,除了 --help 以及 --version 以外,沒有任何其他選項。
使用 unlink 刪除文件,可以這樣:
unlink filename
刪除鏈接,可以這樣使用:
unlink link_name
刪除成功后,不會有任何輸出:
這就是 unlink 命令的功能,除此以外不做任何其他事情。
unlink 不能同時刪除多個文件和鏈接
rm 命令可以一次刪除多個文件。但是 unlink 卻不能,它一次只能刪除一個文件或者鏈接,而且,也不能使用全局模式(globbing patterns)。
如果我們嘗試給定多個文件的話,它會拋出一個錯誤,執行失敗:
[gliu@fedora ~]$ unlink *.txt
unlink: extra operand ‘file2.txt’
Try 'unlink --help' for more information.
同時刪除多個鏈接也會如此。
使用 unlink 不能刪除目錄
GNU 實現下的 unlink 命令是無法刪除目錄的,如果給定的文件名稱是一個目錄,就會報錯:
[gliu@fedora ~]$ unlink new_dir
unlink: cannot unlink 'new_dir': Is a directory
rm 和 unlink 的區別
unlink 命令使用 unlink 系統命令,而 rm 命令使用 unlinkat 系統調用,兩個系統調用幾乎相同。但是這兩個命令之間還是有一些明顯的差異。
如前文所述,unlink 命令在同一時間只能刪除一個文件或鏈接,而 rm 命令可以刪除多個;unlink 命令不能刪除目錄,而 rm 命令能刪除目錄。
rm 命令在執行的時候,首先會安全檢查,如果你沒有文件的寫權限,那么系統會要求你給出寫權限(sudo或者切換至管理員用戶),或者使用強制刪除選項 -f;而 unlink 則不會進行安全檢查,直接刪除文件。
另外,與 rm 不同,unlink 沒有其他選項。
在某些情況下,相比于 rm,你可能更喜歡使用 unlink。比如你希望強制刪除一個文件,而不考慮安全或者權限問題;或者如果刪除失敗(比如文件不存在)的話你希望能看到報錯信息,這種情況下就可以使用 unlink。因為使用 rm -f 強制刪除文件,如果文件不存在的話,不會顯示任何錯誤信息。