如何防止意外rm -rf / *?


164

我只是rm -rf /*不小心跑了,但我的意思是rm -rf ./*(请注意斜线后面的星星)。

alias rm='rm -i'并且--preserve-root默认情况下并没有拯救我,所以对此有没有自动保护措施?


我不是root用户,所以立即取消了该命令,但是在某处有一些宽松的权限,因为我注意到我的Bash提示已经损坏。我不想依靠权限而不是root(我可能会犯同样的错误sudo),并且我也不想因为系统中某个文件丢失而寻找神秘的bug,因此,备份和恢复sudo都很好,但对于这种情况,我希望有更好的选择。


关于三思而后行和使用大脑。我实际上正在使用它!但是我正在用它来解决一些涉及10种不同事物的复杂编程任务。我已经沉浸在这项工作中,没有足够的脑力来检查标志和路径,我什至没有考虑命令和参数,也没有考虑诸如“空当前目录”之类的操作,我大脑的不同部分将它们转换为命令,有时会出错。我希望计算机纠正它们,至少是危险的。


13
仅供参考,您也可以rm -rf . /mydir代替rm -rf ./mydir并杀死您所在的目录。我发现这种情况经常发生。
user606723 2011年

27
用枪类比来说,这个问题是说,请让枪承认我瞄准的是我的脚而不是射击,但是我不想承担没有首先瞄准我的脚的责任。枪支和计算机是愚蠢的,如果您做愚蠢的事情,那么您会得到这些结果。按照枪支类比,除了保持警惕和练习外,没有什么可以阻止您伤害自己。
slillibri 2011年

73
@slillibri除了rm不是枪支之外,它是计算机程序,它可能足够聪明,可以确定用户将删除一些重要文件并发出警告(就像您尝试rm -rf /不加星号时所做的一样)。
Valentin Nemcev 2011年

80
@slillibri枪有安全性。询问如何在rm命令上添加更好的安全性是一个完全合法的sysadmin问题。
吉尔斯

21
不建议使用 sudo rm / bin / rm ,但会阻止大多数rm的出现 :-)
Paul

Answers:


220

我遵循的技巧之一是#在使用rm命令时将其放在开头。

root@localhost:~# #rm -rf /

这样可以防止rm在错误的文件/目录上意外执行。验证后,#从头开始删除。这个技巧行得通,因为在Bash中以开头的单词#会导致该单词和该行上的所有剩余字符被忽略。因此,该命令将被忽略。

要么

如果要防止出现任何重要的目录,还有另一种技巧。

-i在该目录中创建一个命名文件。如何创建这样的奇数文件?使用touch -- -itouch ./-i

现在尝试rm -rf *

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

此处*将扩展-i到命令行,因此您的命令最终变为rm -rf -i。这样,命令将在删除前提示。你可以把这个文件在你的//home//etc/,等。

要么

使用--preserve-root作为一个选项rm。在rm较新的coreutils软件包中,此选项是默认选项。

--preserve-root
              do not remove `/' (default)

要么

使用安全RM

网站摘录:

Safe-rm是一种安全工具,旨在通过使用包装程序替换/ bin / rm来防止重要文件的意外删除,该包装程序将对给定的参数与永不删除的可配置文件和目录黑名单进行检查。

试图删除这些受保护的文件或目录之一的用户将无法执行删除操作,而是显示警告消息:

$ rm -rf /usr
Skipping /usr

10
安全rm看起来非常好,现在就开始研究…
Valentin Nemcev 2011年

45
安全rm整洁。这也是-i文件的一个绝妙招。哈哈 笨蛋
EricR 2011年

5
在UNIX中完成某种诡计是很神奇的。
WernerCD 2011年

4
创建名为-i的文件绝对是纯天才。大约一年前,当我不小心在VPS上运行rm -rf / etc / *时,我可以使用它(幸运的是,我每晚拍摄快照,因此能够在45分钟内恢复)。
David W

9
天才。touch -- -rf
法术

46

你的问题:

我只是偶然地运行rm -rf / *,但我的意思是rm -rf ./*(请注意斜杠后的星号)。

解决方案:不要那样做!作为实践,不要./在路径的开头使用。斜杠不会为命令添加任何值,只会造成混乱。

./*与的含义相同*,因此上述命令最好编写为:

rm -rf *

这是一个相关的问题。我经常看到以下表达式,其中有人假定将FOO其设置为/home/puppies。实际上,直到今天,我才在一家主要软件供应商的文档中看到了这一点。

rm -rf $FOO/

但是,如果FOO未设置,则结果为rm -rf /,这将尝试删除系统上的所有文件。尾部的斜杠是不必要的,因此在实践中不要使用它。

以下将做同样的事情,并且不太可能损坏您的系统:

rm -rf $FOO

我已经很难学到这些技巧。14年前,当我拥有第一个超级用户帐户时,我不小心rm -rf $FOO/从shell脚本中运行并破坏了系统。其他4位系统管理员对此进行了检查,然后说:“是的。每个人都做一次。现在,这里是您的安装媒体(36个软盘)。去修复它。

此处的其他人推荐诸如--preserve-root和的解决方案safe-rm。但是,并非所有Un * xe变体都具有这些解决方案,并且可能不适用于Solaris,FreeBSD和MacOSX。此外,还safe-rm要求您在使用的每个Linux系统上安装其他软件包。如果您依靠safe-rm,当您开始新工作且未safe-rm安装新工作时会发生什么?这些工具是拐杖,最好依靠已知的默认值并改善您的工作习惯。


19
我的朋友告诉我他从来不使用rm -rf *。他总是先更改目录,然后使用特定的目标。原因是他经常使用shell的历史记录,并且担心在历史记录中使用这样的命令可能会在错误的时间弹出。
haggai_e 2011年

@haggai_e:小费。当我不熟悉Unix时,我曾经遇到一个错误,该错误rm -rf *也已删除...。我是root用户,它遍历了较低的目录,例如../../..,并且具有破坏性。rm -rf *从那时起,我一直非常小心。
Stefan Lasiewski 2011年

2
rm -rf $FOO如果需要的话不会有帮助rm -rf $FOO/$BARcd $FOO && rm -rf $BAR会有所帮助,尽管时间更长。
维克多·谢尔琴科

5
@VictorSergienko,用bash表示${FOO:?},如rm -rf ${FOO:?}/和中所述rm -rf ${FOO:?}/${BAR:?}。它将阻止它永远翻译成rm -rf /。我在这里的回答中对此有更多信息。
Acumenus

@haggai_e:我发现这是有关此主题的最佳建议之一。我通过rm -rf *在for循环中使用而烧伤了手指,该循环被错误地更改为错误的目录,并最终删除了其他内容。如果我会使用特定的目标,则删除错误内容的机会会少得多。
里奇2015年

30

由于这是在“ Serverfault”上,因此我想这样说:

如果你有几十个或更多的服务器,以管理员/用户,一个相当大的团队的人打算rm -rfchown错误的目录。

您应该有一个计划,以尽可能少的MTTR来恢复受影响的服务。


4
而且,您应该使用VM或备用盒来进行恢复-找出不起作用的部分并完善上述计划。我们正在每两周进行一次重新启动-因为我们的建筑物停电,而且每次都感到痛苦。我们每次学习时间,这位为等自动化/修复的init.d脚本-通过做所有机架的几个计划停机,我们从到处乱跑到现在约3小时的几天剪
丹尼装订

并在VM上尝试此命令。这真有趣!但是先拍摄快照。
Stefan Lasiewski 2011年

23

最好的解决方案包括改变您的习惯,不要rm直接使用。

一种方法是先运行echo rm -rf /stuff/with/wildcards*。检查通配符的输出看起来是否合理,然后使用shell的历史记录执行不带的上一个命令echo

另一种方法是将echo命令限制在您将要删除的内容令人目眩的情况下。而不是删除目录中的所有文件,而是删除目录并创建一个新目录。一个好的方法是将现有目录重命名为DELETE-foo,然后创建foo具有适当权限的新目录,最后删除DELETE-foo。此方法的附带好处是,您的历史记录中输入的命令是rm -rf DELETE-foo

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

如果您确实要删除一堆文件是因为您需要保留该目录(因为它必须一直存在,或者因为您没有重新创建该目录的权限),请将文件移到另一个目录,然后删除该目录。

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(按Alt+ .键。)

从内部删除目录将很有吸引力,因为目录rm -rf .短,因此错字风险低。不幸的是,典型的系统不允许您这样做。rm -rf -- "$PWD"相反,您可以输入错别字,但是大多数错误导致无法删除任何东西。请注意,这会在您的shell历史记录中留下危险的命令。

只要有可能,请使用版本控制。您不是rm,您cvs rm还是其他人,那是无法挽回的。

Zsh具有一些选项,可以在运行之前rm使用列出目录中所有文件的参数来提示您:(rm_star_silent默认情况下为开)在执行之前提示rm whatever/*rm_star_wait(默认情况下为关)会增加10秒钟的延迟,在此期间您无法确认。如果您打算删除某个目录中的所有文件,则此方法用途有限,因为您已经期待出现提示。它可以帮助防止像错别字rm foo *rm foo*

还有更多解决方案,涉及更改rm命令。这种方法的局限性在于,有一天您将使用真实的计算机,rm并且会自动进行呼叫rm,安全地确认您的确认……然后您将恢复备份。


mv -t DELETE_ME -- *比较简单。
东武

@Giles不rm直接使用是个好建议!更好的选择是使用find命令
aculich'2

而且,如果您需要保留目录,则可以使用find somedir -type f -delete来删除目录中的所有文件, somedir但保留目录和所有子目录,因此非常简单。
aculich 2012年

19

正如您提到的,您始终可以使用别名:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

您也可以将其与命令行Twitter客户端集成,以rm -fr /*root身份擦拭硬盘,以提醒您的朋友您几乎被羞辱了。


3
为telnet miku.acm.uiuc.edu +1
阿里

1
别名echo =“ telnet miku.acm.uiuc.edu”
kubanczyk 2011年

我一定不够老练……这有什么意义telnet miku.acm.uiuc.edu
凯尔·斯特兰德

试试看,找出答案。它是非破坏性的。如果您应有的偏执狂,请在VM中运行。
Naftuli Kay 2015年

3
-1您不能为命令中的空格加上别名,更不用说/ *了,这是一个无效的名称
xenithorb


15

防止意外的最简单方法rm -rf /*是避免所有使用该rm命令!实际上,我一直很想运行rm /bin/rm以完全摆脱该命令!不,我不是在开玩笑。

而是使用command-delete选项find,但是首先删除文件之前,我建议预览将要删除的文件:

find | less

请注意,在现代版本中,find如果省略目录名称,它将隐式使用当前目录,因此上述等效于:

find . | less

确定要删除的文件后,即可添加-delete选项:

find path/to/files -delete

因此,不仅find 使用更安全,而且更具表达力,因此,如果您只想删除目录层次结构中与特定模式匹配的某些文件,则可以使用如下表达式进行预览,然后删除这些文件:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

find除了更安全之外,还有很多很好的学习和使用的理由rm,所以如果您花时间学习使用的话,以后会感谢自己的find


非常有趣的讨论。我喜欢您的方法,并做了一些摘要。它效率极低,因为它最多只能调用3次,但是对我而言,这是一个不错的开始:github.com/der-Daniel/fdel
Daniel Hitzel

14

这个线程中有一些非常糟糕的建议,幸运的是,大多数建议已被否决。

首先,当您需要成为root用户时,请成为root用户-sudo,各种别名技巧会使您变得虚弱。更糟糕的是,它们会使您粗心。学习以正确的方式做事,请停止使用别名来保护您。有一天,您会扎根在没有训练轮的箱子上,然后炸毁东西。

第二-生根发芽时,请想像自己开着一辆载满学童的公共汽车。有时您可以欣赏广播中的歌曲,但是有时您需要双向浏览,放慢速度并仔细检查所有镜子。

三-你很少真正rm -rf-更可能要mv something something.bakmkdir _trash && mv something _trash/

第四-永远是ls通配符rm-在永久销毁某物之前,先对其进行观察并没有什么疯狂的。


2
+1使用ls
2011年

@eventi我同意在这个线程中有一些可怕的建议和丑陋的骇客。在销毁某物之前先查看它绝对是一个好主意,但是有一种使用findcommand 进行此操作的更好方法
aculich

我看不到查找是多么简单或更安全,但是我喜欢您的find . -name '*~'例子。我的意思是,ls它将列出rm将使用的相同的glob 。
eventi 2012年

11

这是我的标准,专门针对rm上下文中的正则表达式,但是在这种情况下,它可以为您省钱。

我总是先做echo foo*/[0-9]*{bar,baz}*一下,看看正则表达式要匹配什么。获得输出后,我将返回命令行编辑并更改echorm -rf。我从未使用rm -rf过未经测试的正则表达式



5
好,我在找什么?您是否指出用于文件匹配的regexp语法与perl中使用的不同(有时用不同的名称来称呼)?还是我错过的其他几点?很抱歉,我的想法很慢,这是星期六早上在这里的第一件事!
MadHatter

9
这些您称为“ regexp”的东西实际上是glob。它不是不同的regex语法;它不是正则表达式。
bukzor 2011年

1
当然可以提出这种论点。但是,从有关正则表达式的Wikipedia文章中,我发现“许多现代计算系统在匹配文件系统中的文件名时提供通配符。这是许多命令行Shell的核心功能,也称为Globing”(请注意)使用“也称为”,在我看来,这表明调用包含元字符以匹配一个或多个文件名正则表达式的令牌是正确的。我同意“通配符”是一个更好的术语,因为除了在文件名匹配中使用正则表达式外,它不代表其他任何含义。
MadHatter 2011年

1
@MadHatter另外,尽管外观在外观上有些相似,但语义上与正则表达式有很大不同。在正则表达式中,的含义*有一个非常精确的定义,称为Kleene Star,它是一元运算符,它匹配要应用它的集合中的零个或多个元素(在正则表达式的情况下,字符前面的字符或字符集Kleene Star),而在*匹配中则遵循以下模式。即使它们看起来有相似的语法,它们在语义上也有很大不同。
aculich

9

解决此问题的方法是进行定期备份。每当您生产一些您不想冒险丢失的东西时,都要备份它。如果您发现定期备份太麻烦了,请简化该过程,以免麻烦。

例如,如果您使用源代码,请使用类似git镜像代码的工具并将历史记录保留在另一台计算机上。如果您处理文档,请使用脚本rsync将文档发送到另一台计算机。


诸如btrfs之类的写时复制文件系统也可以提供帮助。您可以轻松设置在本地运行的简单自动快照轮换(除了外部备份)。
malthe

6

减少这种风险的最好方法似乎是像大多数GUI一样进行两阶段删除。也就是说,将rm替换为将内容移动到垃圾目录(位于相同卷上)的内容。然后,在经过足够的时间后发现所有错误,然后清理该垃圾。

一个这样的工具,垃圾CLI中,对Unix的StackExchange讨论,在这里


这是我在每台计算机上安装的第一件事。它应该是默认的删除工具,仅当您需要立即完全删除某些内容时,才使用rm。我为它还没有起飞感到难过,但是有一天它会起飞。可能是在非常公开的rm实例之后导致了一个无法通过备份解决的巨大问题。可能是恢复所花费的时间起着重要作用的东西。
格里

+1使用Linux 20年后,我仍然认为应该有某种垃圾回收行为rm
肖瓦斯18-3-7的

3

避免此类错误的一个重要关键因素是不要使用root帐户登录。使用普通的非特权用户登录时,需要sudo为每个命令使用。因此,您应该更加小心。


4
我不相信sudo会阻止类似的事情。即使您在“ rm”之前键入“ sudo”,也可以进行与OP相同的输入错误。
cjc 2011年

1
提及在编辑工作中担任
主角

如果您仍然不相信使用sudo和备份。看看此页面:forum.synology.com/wiki/index.php/…。它谈论创建回收站。希望这可以帮助!
哈立德

1
@Khaled我正在使用sudo和备份,我只是想为这个特定问题提供更好的东西
Valentin Nemcev 2011年

3

当我递归删除目录时,将-r,以及(-f如果适用)放在命令的末尾,例如rm /foo/bar -rf。这样,如果我不小心按了Enter键而又未键入整个路径,则该命令不是递归的,因此可能无害。如果我在尝试输入反斜杠时碰到Enter键/foo,我会写rm /foo而不是rm -rf /foo

在使用GNU coreutils的系统上,这很好用,但是在其他一些Unix上,这些实用程序不允许将选项放在最后。幸运的是,我很少使用此类系统。


2

这可能很复杂,但是您可以在SELinux中设置角色,以便即使用户通过sudo su-(或plain su)成为root用户,删除文件的能力也受到限制(您必须以root用户直接登录才能删除)文件)。如果您使用的是AppArmor,则可能执行类似的操作

当然,另一个解决方案是确保您有备份。:)


2

避免使用通配符。在Bash中,您可以设置noglob。但是同样,当您移动到noglob未设置的系统时,您可能会忘记这一点,然后继续进行。

设置noclobber为也防止mvcp破坏文件。

使用文件浏览器进行删除。某些文件浏览器提供垃圾桶(例如Konqueror)。

下面是另一种避免阻塞的方法。在命令行中,我echo filenamepattern >> xxx。然后,我用Vim或vi编辑文件,以检查要删除的文件(注意filenmates中的文件名模式字符。),然后使用%s/^/rm -f/来将每一行变成删除命令。来源xxx。这样,您可以查看要删除的每个文件,然后再执行操作。

将文件移动到“阁楼”目录或tarball。或使用版本控制(如我之前所说)。


+1用于在删除文件之前使用某种预览文件的方法,但是有更简单,更安全的方法可以使用findcommand进行操作
aculich

2

ZSH在执行之前会询问我(默认情况下)rm -rf *


1

在外部chattr,让root运行这样的命令并没有很多保护措施。这就是为什么在特权运行时正确的组和谨慎的命令很重要的原因。

下次; 扩大您打算删除的文件的范围-从中省略'f' rm -rf或使用find并将其传递给xargs rm


建议您最好使用find,但我建议在答案中使用更安全的方法。无需使用,xargs rm因为所有的现代版本都find具有-delete选项。另外,要安全使用xargs rm,还需要使用find -print0xargs -0 rm否则遇到诸如带空格的文件名之类的问题。
aculich'2

我的观点是不是有关xargs的细微之处,而是使用查找第一个,但不删除文件,然后继续..
thinice

是的,我认为确定使用文件范围find是一个不错的建议,但是,xargs如果您建议使用它,则细微差别很重要,否则在遇到带有空格的文件时会引起混乱和沮丧(通过使用该-delete选项可以避免)。
aculich

1

这里可以找到其他命令的一些安全别名,以防止发生类似的灾难:

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

注意大写字母-I,它不同于-i

在删除三个以上的文件之前或在递归删除时提示一次。比-i更具侵入性,同时仍然可以防止大多数错误


尽管I选项不会回显您要删除的内容。
Calmarius

1

我通常使用该-v标志来查看要删除的内容,^C如果有丝毫疑问,可以有机会快速进行。这并不是防止不良情况rm的真正方法,但是在发生问题时可以用这种方法来限制损坏。


1

我在基于Unix的计算机上的删除过程如下。

  • ls /path/to/intented/file_or_directory在终端窗口中键入,然后按return(或Tab按需要)以查看文件列表。

如果一切都好

  • 单击该up arrow键可ls /path/to/intented/file_or_directory再次从终端历史记录中获取。

  • 根据需要lsrmrm -r或替换rm -rf。我个人不喜欢使用-f标志。

这种验证过程还可以防止rm命令过早执行,这在我开始执行此过程之前发生在我身上。


在删除文件之前先预览文件是一个好主意,并且有一种更安全,更富表现力的方法,可以使用find 我在答案中解释的进行操作
aculich 2012年

1

如果您现在不打算养成新习惯,.bashrc/.profile那么可以添加一些测试来检查您是否打算做一些愚蠢的事情。我想到了一个Bash函数,我可以grep寻找一种可能会破坏我的一天的模式,并提出了以下方案:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

它的好处是它只是Bash。

显然,这种形式的通用性不够,但是我认为它具有潜力,因此请发表一些想法或评论。


尝试删除文件之前先尝试预览是个好习惯,但是此解决方案过于复杂。您可以使用find命令以更通用的方式非常简单地完成此操作。另外,我不明白您为什么说“关于它的好处是它只是Bash”?建议避免脚本中的重击
aculich

为了防止我们说“ rm -rf ./*”和“ rm -rf dir / *”时出现“ rm -rf / *”或“ rm -rf dir / *”,我们必须检测模式“ / *”和“ *”(简单表示)。但是我们不能仅仅通过grep传递所有命令行参数以寻找某种有害模式,因为bash在传递通配符参数之前将其扩展(星号将扩展到文件夹的所有内容)。我们需要“原始”参数字符串。这是通过set -f完成的,然后调用“ myrm”函数,然后将其传递给原始参数字符串,grep查找预定义的模式。*
2012年

我了解您尝试使用的功能与Bash set -f中的功能等效set -o noglob,但这仍然不能解释您的声明“关于它的好处是它只是Bash”。相反,你完全可以在通过不使用任何壳一个通用的方法消除问题rm可言,而是使用find命令。您是否实际尝试过该建议,以查看它与您在此处提出的建议相比如何?
aculich

@aculich by bash我的意思是没有python或perl依赖项,一切都可以在bash中完成。一旦我修改了.bashrc,我就可以继续工作而不必改变旧习惯了。每次我调用rm bash都会确保我不会做一些愚蠢的事情。我只需要定义一些我想引起注意的模式。就像“ *”一样,它会删除当前文件夹中的所有内容。每隔一次,这正是我想要的,但是工作交互性可以添加到“ myrm”中。
2012年

@aculich OK不好意思,我还没有尝试过,我认为这需要对工作流程进行重大更改。刚刚在Mac OS X上检查过,我的.bash_history是500,其中27个命令是rm。这些天,我不经常使用终端。
2012年

1

可悲的是,由于业力不足,我不能在上面发表评论,但我想警告其他人,安全rm并不是发生意外大规模删除噩梦的灵丹妙药。

以下内容已在Linux Mint 17.1虚拟机中进行了测试(警告那些不熟悉这些命令的人:请勿这样做!实际上,即使是熟悉这些命令的人也应该/也不应该这样做,以避免灾难性的数据丢失):

文字版本(精简):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

图片版本(完整):

在此处输入图片说明


1

我喜欢回收站的Windows方法。

我通常为需要删除的所有内容创建一个名为“ / tmp / recyclebin”的目录:

mkdir /tmp/recyclebin

永远不要使用rm -rf,我总是使用:

mv target_folder /tmp/recyclebin

然后,稍后,我使用一个脚本或手动清空回收站。


0

呵呵(未经测试,但有些滑稽!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

接着:

alias rm="/usr/local/bin/saferm"

实际上,无论您是以root用户身份运行,在其之前添加“ sudo”等,在对glob执行此类操作之前,您都应该稍作停顿。您可以在同一glob上运行“ ls”,等等。但是,从精神上讲,您应该停下来一秒钟,确保输入了想要的内容,确保您想要的实际上是您想要的内容,等等。我想这主要是通过在第一年中销毁某些东西来学习的。 Unix SA,就像热炉是一个很好的老师,告诉您炉子上的东西可能很热。

并确保您有良好的备份!


在尝试危险的事情之前,我会三思而后行,但是由于某种原因,我过去已经把事情毁了,因为这种疏忽总是无法奏效。
Valentin Nemcev 2011年


0

只需使用ZFS来存储您需要防止意外删除的文件,并拥有一个守护进程即可:

  • 定期制作此文件系统的快照
  • 删除旧的/不必要的快照。

如果文件被删除,覆盖,损坏等等,只需将文件系统回滚到最后一个良好快照的克隆即可。


0

与其说是一个答案,不如说是一个小窍门,我始终rm (dir) -rf不会rm -rf (dir):直到最后一刻才成为核子。

它有助于减轻您以一种仍然有效的删除方式使目录名变胖的情况,例如滑动并按回车键。


很聪明,但在BSD上不起作用,在BSD上rm,选项必须位于文件名之前。
svenper

是的 我发现最近使用苹果的。解决方法是安装gnu工具并为所有内容设置别名:)和/或最好将苹果扔进垃圾桶。:)
Sirex


1
如果允许的话,我会在一纳秒内完成。与linux相比,这是垃圾。
Sirex

0

我认为这是一个强大的预防技巧,在shell中带有*扩展快捷方式:

首先,键入rm -rf *rm -rf your/path/*,不要键入Enter密钥。(当然,在使用时,您应该养成不要急于快速按Enter的习惯rm -rf

然后,按Alt-Shift-8(即Alt-Shift-*)以bash显式扩展“ *”通配符。这也避免了在浏览历史记录时重新输入“ rm -rf *”命令。

最后,在检查扩展具有正确的文件/目录后,按Enter。

做完了


0

如果这可以帮助某人解决自己的情况:

1.使用rmsafe

它将文件移动到“废纸“”文件夹,您始终可以通过以下简单的方法将其恢复mv

$ rmsafe /path/to/important/files

来源:https : //github.com/pendashteh/rmsafe

2.使用safe

您可以为rm使用安全设置别名:

$ alias rm="safe rm"

现在,如果您运行,rm /*则会得到以下响应:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

而且我相信你不会打字y

资料来源:https : //github.com/pendashteh/safe

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.