rm常見命令參數
rm: 可以備份,盡量不要刪除,比刪除更好的是重命名 -->只刪除文件鏈接,重啟、重新寫入后回收
刪除文件時,使用絕對路徑或者進入到目標路徑下后使用刪除命令 –> 禁止使用rm –rf ./XXX文件【少個點就是根目錄了】
-r : 刪除文件夾
-f : 強制刪除文件
rm命令刪除文件的原理
文件刪除原理: Linux通過文件link的數量控制文件的刪除,只有當一個文件不存在任何link的時候且沒有程序調用的時候,文件才會被真正刪除。
就rm命令而言,就是減少磁盤引用計數i_link(文件到inode的鏈接數量);inode節點指向存儲數據的block,刪除文件並不是清除inode和block,而是將文件的硬鏈接為0,引用計數為0 才能刪除文件
注:如果有新的數據存儲或者系統通過類似fsck命令做磁盤檢查的時候,被刪除的數據塊和目錄會被釋放,數據無法找回
文件刪除的條件:
i_nlink 文件的硬鏈接數量,磁盤的引用計數器
i_count 內存引用計數(一個文件被幾個程序調用,有一個程序使用i_count + 1 )
i_link = 0 && i_count =0
刪除一個文件,也是刪除上一級目錄的block里面的文件名
rm相關的問題答疑
問題1:當執行了刪除操作后,ls 無法查找到這個文件,但是調用這個刪除文件的進程卻正常執行,依然能夠讀取和寫入文件內容?
答案: 因為rm只是減少了i_nlink,如果沒有其他的鏈接了[即i_link=0】,但由於文件依然被進程使用,所以即時執行了rm命令,系統並未真正的刪除。
只有當i_link和i_count==0時候,系統才會整正刪除這個文件,也就是刪除文件還需要解除進程對該文件的調用才行。
問題2:當文件沒有被調用,但是執行了rm命令,刪除后的文件還能找回來么?
答案:rm只是減少了i_link的數量,實際就是將文件的inode的鏈接刪除了,但是並沒有刪除文件實體(block數據塊),如果停止機器工作,還是可以找回數據的。如果此時繼續有數據寫入,當新數據就可能會被分配到被刪除的數據的block數據塊,此時文件就會被真正的回收。
問題3:被進程占用的文件能否被刪除?
答案: 能
問題4:如何找回沒有鏈接指向但被進程占用的文件?
答案:lsof -c 'vim' 根據后台占用文件的命令查找
[root@localhost omc]# touch hhh.txt [root@localhost omc]# vim hhh.txt & [root@localhost omc]# rm hhh.txt [root@localhost omc]# lsof -c 'vim' | grep hhh.txt vim 3385 root 4u REG 8,2 4096 271298 /home/omc/.hhh.txt.swp
常用的命令展示:
刪除某個文件夾: -r
rm -rf /home/omc/last.txt
自定義回收站功能: 定義一個函數,將文件移動到指定目錄;同時別命名rm命令即可
myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; } alias rm='myrm' # $@: 這個程序的所有參數,作為一個i整體傳遞、