1. 程式人生 > >let's shell---rm -rf 命令居然刪除目錄失敗

let's shell---rm -rf 命令居然刪除目錄失敗

當我們在Linux系統中解除安裝軟體或清理資料時,經常會使用rm -rf命令去刪除某個目錄,例如刪除/tmp/tektea目錄:

# rm -rf /tm/tektea

rm命令的-r和-f這兩個引數的man含義如下:

-r, -R, --recursive
remove directories and their contents recursively

-f, --force
ignore nonexistent files, never prompt

所以-r和-f分別表示可遞迴刪除目錄和強制刪除檔案,組合起來就是我們在Linux系統中所熟知的、最暴力的強制刪除某個目錄的命令了,即便目錄下檔案正在被讀寫,也依然會幹乾淨淨的刪除掉該目錄,因為有-f引數,聽起來合情合理。但你現在已經看了本文的標題,你開始迷惑了吧?

沒關係,下面我們通過一些測試來驗證下這個暴力的 rm -rf 命令,看看它是不是真的那麼生猛,可以破壞一切目錄。

用例1:使用cp命令持續往/tmp/tektea目錄下拷貝檔案,然後rm -rf /tmp/tektea,測試程式碼如下
# cat test1.sh
#!/bin/bash

i=1
while true
do
    cp /tmp/testfile /tmp/tektea/$i
    let i++
done

# cat /tmp/testfile
hi
    驗證結果:執行bash test1.sh後,rm -rf /tmp/tektea刪除成功

用例2:使用dd命令持續往/tmp/tektea目錄下寫檔案,然後rm -rf /tmp/tektea,測試程式碼如下

# cat test2.sh
#!/bin/bash

while true
do
    dd if=/dev/zero of=/tmp/tektea/ddfile bs=1024 count=1000000000
    let i++
done

驗證結果:執行bash test2.sh後,rm -rf /tmp/tektea刪除成功

用例3:使用echo命令持續往/tmp/tektea目錄下的檔案寫資料,然後rm -rf /tmp/tektea,測試程式碼如下
# cat test3.sh
#!/bin/bash

while true
do
    echo hi >>/tmp/tektea/echofile
done

驗證結果:執行bash test3.sh後,rm -rf /tmp/tektea刪除失敗

,且有以下報錯:

# rm -rf /tmp/tektea/
rm: cannot remove `/tmp/tektea': Directory not empty

通過上面的驗證,首先我們可以得出這條結論:使用rm -rf命令刪除目錄時,如果該目錄下的檔案正在被寫入,那麼會存在刪除失敗的可能

那麼,以上三個用例都是在往/tmp/tektea目錄寫入資料,為什麼僅僅是第三個場景會失敗呢?

各種跡象都把根因指向到了 rm 命令(有興趣的朋友可以下載Linux中rm命令的原始碼走讀下),rm命令在-r -f強制刪除目錄時,其邏輯是這樣的:

1)從被刪除目錄的最裡層遞迴刪除檔案;
      2)當最裡層目錄A的檔案被刪除完以後,再刪除該層資料夾A;
      3)在刪除資料夾A前,再檢查目錄A下是否還有檔案,如果有則報錯Directory not empty(編外:注意這裡了

現在再來回答這個問題——“為什麼僅僅是第三個場景會失敗呢?”,不過在回答前,我先給大家展示兩個資料:

1. 用例1使用cp往/tmp/tektea目錄拷貝資料,15秒大約生成了8600個檔案,每秒約573檔案,相當於每秒573次寫入
      2. 用例3使用echo往/tmp/tektea/echofile寫資料,15秒大約在echofile中寫入了59萬行,每秒約40000次寫入

所以結合rm的實現和幾個用例差異可以清楚的知道——在刪除某個目錄時,若有程序往該目錄寫入資料,則需要先停止該程序的服務(或kill掉該程序),所以我們的一些Shell程式碼在解除安裝或刪除目錄時就存在失敗的可能。



相關推薦

let's shell---rm -rf 命令居然刪除目錄失敗

當我們在Linux系統中解除安裝軟體或清理資料時,經常會使用rm -rf命令去刪除某個目錄,例如刪除/tmp/tektea目錄: # rm -rf /tm/tektea rm命令的-r和-f這兩個引數的man含義如下: -r, -R, --recursive rem

最暴力的 rm -rf 命令居然刪除目錄失敗了!為什麼?

當我們在Linux系統中解除安裝軟體或清理資料時,經常會使用rm -rf命令去刪除某個目錄,例如刪除/tmp/tektea目錄: [code lang=”shell”]# rm -rf /tm/tektea[/code] rm命令的-r和-f這兩個引數的man含義如下: -r, -R, –recur

Linux下防止rm -rf /命令刪除

做伺服器運維的人眾所周知, rm -rf / 命令在Linux下執行後,就是一場災難。 好吧,先看一個事例,瞭解下這個命令的恐怖>>>一個命令rm -rf/ ,他把整個公司刪沒了 為了防止這種誤刪除操作,找了很多辦法,有建議回收站機制、也有說給重要目錄設

linux系統下文件夾以及文件的權限查看及修改;以及文件和文件夾刪除 rm -rf 命令的使用

系統 chang html 更改 修改文件 art 文件名 mage 管理命令 1、直接查看文件或者文件夾的權限命令: >>ll 或者 >>ls -l r代表讀取權限,w寫權限,x代表執行權限 第一個代表文件類型,-代表是普通文件,d代表是文

Linux rm -rf命令慎用!

Linux rm命令 rm命令Remove,功能:1)刪除目錄,2)刪除檔案。 (可以遞迴的刪除指定目錄的所有檔案及子目錄) 注意:rm是一個危險的命令,使用的時候要特別當心,尤其對於初學者來說。(今天我就用rm -rf 的命令把使用者名稱目錄下的所有

linux 命令 find與rm實現查詢並刪除目錄或檔案

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #ffffff } span.s1 { }   504  find /Volumes/WD/data

perl 呼叫rm -rf 遞迴刪除指定資料夾,提示 can not remove: not empty 原因

my $dir = "/root/syn/Design/test.txt"; open $fh_dir, "> $dir " or die"$!"; chdir "/root/syn/" or die "$!"; system "rm -rf Design"; 控制代碼鎖定

使用testdisk恢復誤刪檔案【rm -rf 命令

進入,下載適合自己系統的版本 http://www.cgsecurity.org/testdisk-6.13.linux26.tar.bz2 下載 解壓 tar jxf testdisk-6.14-WIP.linux26.tar.bz2 進入解

rm -rf *命令解決

rm -rf / home/wilson/logs/ 幸運的是測試環境執行,在生產環境不堪設想。 多了一個空格 一、命令替換 在生產環境將rm -rf 命令替換為mv,再寫個定時shell定期清理。 二、收攏許可權 帳號許可權的分離,線上分配work帳號,只能夠刪除/h

rm -rf 命令 與正則表示式

每次部署專案上去都會有個習慣,隨手備份一下當天的war包,但是時間一長,導致很多版本在上面,到最後佔用磁碟空間,一個一個去刪,太麻煩了,搜了一下,看有沒有批量刪除的命令,結果還真有 簡單應用的例子如下: 命令: rm -rf [Gg]* 刪除7號的備份

Linux 基本shell命令和Linux rm -rf原理分析

還是老規矩,循序漸進,先來簡單入門一下Linux Linux中一切皆檔案,所以我們應該知道的是Linux中只有一個根目錄,然後分為下圖幾個目錄,其中桌面在home 目錄下,圖(來源網上): cd > cd 目的地 --(..代表父目錄,.代表

相對和絕對路徑、cd命令、創建和刪除目錄rm命令

相對和絕對路徑、cd命令、創建和刪除目錄、rm命令一、相對和絕對路徑、cd命令相對路徑:相對所在位置的路徑[root@centos-01 ~]# pwd #顯示當前目錄/root[root@centos-01 ~]# ls .ssh/authorized_keys #相對於/root.ssh/authori

相對和絕對路徑、cd命令、創建和刪除目錄mkdir/rmdir 、rm命令

linux cd 目錄 相對和絕對路徑:相對路徑:相對當前目錄所在的路徑,不是由根開頭絕對路徑:從根開始的目錄 無論從哪個用戶下都能通過絕對路徑找到配置文件pwd:查看當前所在目錄cd命令:cd - 表示你上一次所在的用戶目錄,起交互作用cd    進入當前用戶的家目錄cd ~

centos rm命令恢復刪除的文件

gpl 運行 就會 fsp ted 事情 好的 節點 沒有 Linux有時候執行了 rm -rf 等操作誤刪了文件絕對是一件可怕的事情,好在有一些解決的辦法可以臨時救急。這時我們就要用到一款叫做extundelete的工具了。 Linux下執行 rm 並不會真正刪除,而是將

相對和絕對路徑/cd命令/創建和刪除目錄mkdir/rmdir/rm命令

star end body pos mov 級聯 oot 家目錄 文件 2.6 相對和絕對路徑 2.7 cd命令 2.8 創建和刪除目錄mkdir/rmdir 2.9 rm命令 絕對路徑:從根開始的路徑;文件所在的路徑; 相對路徑:相對於當

2.6 相對和絕對路徑 2.7 cd命令 2.8 創建和刪除目錄mkdir/rmdir 2.9 rm

cd mkdir rmdir 2.6 相對和絕對路徑1、相對與絕對路徑絕對路徑:是從根開始的,也就是/相對路徑:是從相對當前的路徑[root@wangborambo ~]# ls .ssh/authorized_keys.ssh/authorized_keys[root@wangborambo ~

Linux中如何恢復rm命令刪除的文件之extundelete編譯安裝及使用

可用 並且 地址 cat inode res 丟失 lin 所在 1、下載extundelete包,安裝依賴 我用的是Centos系統,在安裝extundelete之前需要安裝e2fsprogs,e2fsprogs-libs,e2fsprogs-devel。 yum in

Linux防止“rm -rf /”誤刪除

com 程序 -a user get prev tar acc 安裝 說明:不解釋了,運維應該在每臺服務器都去配置這個問題以減少災難的發生 方法: 1、safe-rm safe-rm是一個開源軟件用來替代不太安全的rm,可以在/etc/safe-rm.conf中配置路

2.6 相對和絕對路徑 2.7 cd命令 2.8 創建和刪除目錄2.9 rm命令

ado mdi 51cto etc col 例如 sco images 圖片 絕對路徑的概念:從“/”開始的均為絕對路徑,例如我們常用的網卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33,這就是一個絕對路徑文件。相對路徑的概念:

相對和絕對路徑,cd命令,創建和刪除目錄mkdit/rmdir ,rm命令

water pan bsp 開始 chan fff rec str orm 相對和絕對路徑相對路徑:相對當前你所在的一個地址的路徑,不是從根開始。絕對路徑:絕對路徑都是從根開始的命令: pwd : 顯示當前所在的一個位置 cd