--preserve-root 選項
像freebsd, GNU/Linux 這樣的系統(tǒng)都有文件系統(tǒng)根目錄保護機制酝碳,如果沒有指定--no-preserve-root參數(shù)营勤,GNU rm 將拒絕執(zhí)行
rm -rf /
這樣致命的指令(嗯,其實我沒有驗證過其效果啦)淹父,但只應(yīng)用于文件名嚴格為 '/' 的情形世蔗,不能阻止
rm -rf /*
避免使用 ./
前綴
要刪除一個目錄下的所有內(nèi)容,不要使用
rm -rf ./*
,更進一步地颜矿,不要使用 ./*
來引用當前目錄下的所有文件,直接使用 *
即可嫉晶,這樣可以避免寫成 /*
或者 / *
這樣的悲劇發(fā)生骑疆。
chattr 設(shè)置擴展屬性
在需要保護的目錄下創(chuàng)建一個文件名比較靠前的文件 0
,設(shè)置其不可刪除
touch /0
chattr +i /0
這種做法對 -f 選項的rm 命令行無效替废,其它文件仍然會被刪除箍铭。
使用 -i 文件賦予命令行中 rm -i 選項
在重要目錄下創(chuàng)建 -i
文件
touch -- /-i /usr/-i /bin/-i /sbin/-i /etc/-i /lib/-i /lib64/-i \
/boot/-i /dev/-i /var/-i
-i 文件并不能阻止
rm -rf /etc/*
rm -rf ./*
這樣的事情發(fā)生,因為此時 -i 文件的路徑是 /-i, ./-i, 不會被解釋成 rm 的選項椎镣。 所以前面講的避免使用 ./
前綴對于 -i
文件起到作用很重要诈火。
alias rm='rm -I' 并避免使用 -f 選項
因為缺省的 alias 是 rm='rm -i', 所以為了避免刪除每個文件都要確認,得使用 -f 選項(如果沒有 alias rm='rm -i', 刪除多個文件状答、遞歸刪除都不需要使用 -f 選項)冷守。
rm 的 -I 選項的作用是
prompt once before removing more than three files, or when removing recursively. Less intrusive than -i, while still giving protection against most mistakes
此方法不能避免一次誤刪除數(shù)量少于或等于3個的文件。
此方法可以和上面的創(chuàng)建不能具有 i 擴展屬性的文件結(jié)合使用惊科。
將 -r -f 選項放在命令行的最后面
這樣可以避免路徑尚未敲完整時誤按 enter 鍵造成的錯誤操作拍摇。
此方法在使用 GNU coreutils 的系統(tǒng)上可用,在某些unix系統(tǒng)上可能不支持將選項放到命令行的最后馆截。充活。
使用 safe-rm 替代 rm
Safe-rm is a safety tool intended to prevent the accidental deletion of important files by replacing /bin/rm with a wrapper, which checks the given arguments against a configurable blacklist of files and directories that should never be removed.
Users who attempt to delete one of these protected files or directories will not be able to do so and will be shown a warning message instead:
$ rm -rf /usr
Skipping /usr
(Protected paths can be set both at the site and user levels.)
可以將 safe-rm 更名為 rm 并放在 $PATH 中比 原rm 程序靠前的位置。一些腳本中使用完全路徑/bin/rm則不會受此影響蜡娶。雖然將 safe-rm 重命名成 rm 有其好處混卵,但平時應(yīng)該養(yǎng)成盡量避免在命令行中使用 rm 的習(xí)慣,在命令行中 safe-rm 的名稱來執(zhí)行安全刪除操作窖张,以避免因為依賴偽裝成 rm 的safe-rm 導(dǎo)致在沒有 safe-rm 的機器上犯錯幕随。
The system-wide blacklist lives in /etc/safe-rm.conf and you should probably add paths like these:
/
/etc
/usr
/usr/lib
/var
The user-specific blacklist lives in ~/.safe-rm and could include things like:
/home/username/documents
/home/username/documents/*
/home/username/.mozilla
建立回收站機制
回收站機制則是另一種思路,它并不真正執(zhí)行刪除操作荤堪,而是將文件移動到一個特定目錄合陵,可以設(shè)置定時清楚回收站,或者在回收站里面的文件大小達到一定容量時執(zhí)行刪除操作(可以選擇清空澄阳,更保守的做法時設(shè)置soft/hard閾值之類的)以騰出空間拥知。
可以寫個shell腳本替換rm命令,或者在需要刪除文件的時候使用mv命令將文件移動到回收站碎赢。
只讀掛載
boot文件系統(tǒng)可以設(shè)置 noauto,ro
的掛載選項低剔。
防止空變量導(dǎo)致的誤刪除
在腳本中不要使用
rm -rf $FOO/
執(zhí)行這樣的操作前最好檢查變量是否非空,而且不要帶后面的/
。
[[ -n $F00 ]] && rm -rf $FOO
做好備份
這個是王道襟齿,不僅可以防止誤刪姻锁,還可以防止其它如硬盤損壞等原因?qū)е碌臄?shù)據(jù)丟失。
可以采用dump的增量備份機制猜欺,LVM快照位隶,在虛擬化環(huán)境中的快照功能等等。
其它
良好的工作習(xí)慣是非常重要的开皿,不要過于依賴工具涧黄,比如不要因為像 safe-rm 這樣的保護機制而放松警惕,否則當你在一臺沒有那種保護機制的機器上操作時赋荆,會因為過于輕率地使用rm命令導(dǎo)致悲劇笋妥。另外一點就是不要使用root作為日常工作賬號。
我一直以為 rm -rf dir/
和 rm -rf dir
是不同的窄潭,以為前者等價于 rm -rf dir/*
, 因為在 rsync 中 dir/
隱含 dir/*
春宣。但是今天發(fā)現(xiàn)rm -rf dir/
是會刪除 dir 這個目錄的。所以在刪除一個目錄時嫉你,完全沒必要使用 dir/ 這樣的形式月帝,這樣少敲一個鍵且可以避免誤刪的風險。
參考:
通過替換linux rm命令防止誤刪除
How do I prevent accidental rm -rf /*?