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

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


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


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

评论

仅供参考,您也可以执行rm -rf。 / mydir而不是rm -rf ./mydir并杀死您所在的目录。我发现这种情况更常见。

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

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

@slillibri枪有安全性。询问如何在rm命令上增加安全性是一个完全合法的sysadmin问题。

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

#1 楼

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

root@localhost:~# #rm -rf /


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

OR

如果要防止出现任何重要的目录,则还有另外一个技巧。在该目录中名为-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)


OR

使用safe-rm

网站摘录:


Safe-rm是一种安全工具,旨在通过用包装纸替换/ bin / rm来防止重要文件的意外删除
。 ,它会根据给定的参数对文件和目录的可配置黑名单进行检查,这些黑名单永远都不应删除。

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

$ rm -rf /usr
Skipping /usr



评论


safe-rm看起来非常好,现在开始研究...

–瓦伦丁·内姆切夫(Valentin Nemcev)
2011-12-22 17:52

安全rm整洁。这也是-i文件的妙招。哈哈愚蠢的打击。

–EricR
2011年12月2日20:00

在UNIX中完成某种诡计是很神奇的。

–WernerCD
2011-12-21 21:28

天才。巫术会很感人--rf

– Mircea Vutcovici
2011-12-5 19:03

@SachinDivekar这个答案怎么这么高的投票? safe-rm和--- preserve-root是好的建议,但是在#前面似乎并没有那么有效。但是,我真正的烦恼是使用这种特殊的-i文件业务,这很简单,是不好的建议!用奇数名称的文件乱扔文件系统确实没有帮助,尤其是当存在使用find命令预览然后删除的简单,有效且通用的解决方案时:少然后找到-delete。

– aculich
2012年2月26日15:57

#2 楼

您的问题:


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


解决方案:不要那样做!作为实践,请勿在路径开头使用./。正斜杠不会给命令增加任何值,只会引起混淆。 />
这是一个相关的问题。我经常看到以下表达式,其中有人认为./*设置为*。我实际上是在今天从主要软件供应商的文档中看到的。

rm -rf *

但是如果未设置FOO,它将评估为/home/puppies,它将尝试删除系统上的所有文件。后面的斜杠是不必要的,因此在实践中不要使用它。

以下内容将执行相同的操作,并且不太可能损坏系统:

rm -rf $FOO/

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

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

评论


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

– haggai_e
2011-12-4 15:56

如果需要rm -rf $ FOO / $ BAR,则rm -rf $ FOO将无济于事。 cd $ FOO && rm -rf $ BAR会有所帮助,尽管时间更长。

– Victor Sergienko
2013年12月26日17:26



@VictorSergienko(带有bash)如何指定$ {FOO :?},如rm -rf $ {FOO:?} /和rm -rf $ {FOO:?} / $ {BAR :?}一样。这将防止它永远翻译成rm -rf /。我在这里的回答中对此有更多信息。

–触角
2015年2月10日在20:48



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

– Richk
2015年3月30日14:29在

@VictorSergienko如果$ FOO为空,而$ BAR为。或/,恭喜您使用了新的空主目录。

–AndréWerlang
20-4-13在23:46

#3 楼

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

如果您有数十台或更多服务器,且管理员/用户团队庞大,那么有人会错误地发送rm -rfchown目录。

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

评论


而且,您应该使用VM或备用盒来进行恢复-找出不起作用的部分并完善上述计划。我们正在每两周进行一次重新启动-因为我们的建筑物停电,而且每次都感到痛苦。通过对所有机架进行一些计划内的关闭,我们将其从几天的运行时间缩短到现在的大约3个小时-每次我们了解要为init.d脚本自动化/修复等的位。

–丹尼·史泰博(Danny Staple)
2011年12月3日10:19



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

– Stefan Lasiewski
2011年12月4日在1:57

对于快照表文件系统而言,具有回滚功能是一个很好的例子。 ZFS具有此功能... docs.oracle.com/cd/E19253-01/819-5461/gbcxk/index.html

– Unix管理员
20年7月13日在14:21



#4 楼

最好的解决方案是改变您的习惯,不要直接使用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历史记录中留下危险的命令。

只要有可能,请使用版本控制。您没有rmcvs rm之类的东西,这是无法撤消的。

Zsh有一些选项可以在运行rm之前提示您,该参数带有列出目录中所有文件的参数:rm_star_silent(默认情况下为打开)在执行rm whatever/*之前提示,而rm_star_wait(默认情况下为关闭)会增加10秒钟的延迟,您无法确认。如果您打算删除某个目录中的所有文件,则此方法用途有限,因为您已经期待出现提示。它可以帮助防止像rm foo *这样的错字,例如rm foo*。这种方法的局限性在于,有一天您将使用一台具有真正的rm的计算机,然后会自动致电rm,这在确认确认的过程中是很安全的……接下来您将恢复备份。

评论


mv -t DELETE_ME-*更加简单。

–东武
2011-12-4 14:57

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

– aculich
2012-2-26在6:57

而且,如果您需要保留目录,则可以使用find somedir -type f -delete非常简单地执行此操作,该操作将删除somedir中的所有文件,但会保留目录和所有子目录。

– aculich
2012-2-26 15:45

是否可以安全地编写脚本,使回显rm -rf / stuff / with / wildcards *继续执行,并执行rm -rf / stuff / with / wildcards *? @吉尔斯'所以-别再邪恶了'

–警报
20年7月11日在23:35

@alper不会造成额外的伤害,但也没有帮助,因为键入y会成为反射。故障安全仅在添加安全检查时才有用,而在仅添加自动步骤时才有用。

–吉尔斯'所以-不再是邪恶的'
20年7月12日在22:26

#5 楼

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

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 /*为根的硬盘。

评论


为telnet miku.acm.uiuc.edu +1

–阿里
2011年12月3日,下午1:39

别名echo =“ telnet miku.acm.uiuc.edu”

– Kubanczyk
2011年12月3日上午10:56

我一定不够老套……telnet miku.acm.uiuc.edu的意义是什么?

–凯尔·斯特兰德(Kyle Strand)
2015年2月5日在2:07

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

– Naftuli Kay
2015年2月5日,下午2:16

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

–xenithorb
16年4月28日在5:47

#6 楼

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

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

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

第三点-您几乎从未真正需要rm -rf -更有可能想要mv something something.bakmkdir _trash && mv something _trash/

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

评论


+1以使用ls。

– Sachin Divekar
2011-12-5 8:43

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

– aculich
2012年2月26日在6:55

我看不到查找是多么简单或更安全,但是我喜欢您的发现。 -name'*〜'示例。我的观点是ls将列出与rm将使用的相同的glob。

–eventi
2012年3月8日,0:14

#7 楼

是的:不要根深蒂固,在做事前总是三思。

另外,看看类似https://launchpad.net/safe-rm的东西。

评论


提到在编辑中以root身份工作

–瓦伦丁·内姆切夫(Valentin Nemcev)
2011-12-02 17:32



@Valentin:o_O !!

–乔纳森·里奥(Jonathan Rioux)
2011-12-22 17:41

#8 楼

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

而是使用-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,因此,如果您花时间学习使用q431,您稍后会感谢自己。 2079q。

评论


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

–丹尼尔·希策尔(Daniel Hitzel)
18 Mar 9 '18 at 18:33

#9 楼

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

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

评论


请比较:linuxmanpages.com/man3/regex.3.php linuxmanpages.com/man3/glob.3.php

–布克佐尔
2011年12月3日7:32



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

– MadHatter
2011年12月3日7:52



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

–布克佐尔
2011年12月3日在16:59



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

– MadHatter
2011-12-4 15:11



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

– aculich
2012年2月26日在7:09

#10 楼

解决此问题的方法是进行定期备份。每当您生产某些东西时,您都不想冒险丢失它,请备份它。如果您发现定期备份太麻烦了,那么就简化一下过程,这样就不会很麻烦。例如,如果您在处理源代码,请使用git之类的工具来镜像代码并保留历史记录在另一台机器上。如果您处理文档,请使用一个脚本将文档发送到另一台计算机。

评论


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

– Malthe
17年1月17日在15:34

#11 楼

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

评论


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

–格里
16年5月30日在6:49

+1使用Linux 20年后,我仍然认为rm应该有某种垃圾回收行为。

–肖瓦斯(Shovas)
18 Mar 7 '18 at 16:35

#12 楼

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

评论


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

– cjc
2011年12月2日在17:29

提到在编辑中以root身份工作

–瓦伦丁·内姆切夫(Valentin Nemcev)
2011年12月2日于17:32

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

–卡乐德
2011年12月2日在17:44

@Khaled我正在使用sudo和备份,我只是想为这个特定问题提供更好的选择

–瓦伦丁·内姆切夫(Valentin Nemcev)
2011-12-22 17:54

#13 楼

当我递归删除目录时,我将-r-f(如果适用)放在命令的末尾,例如rm /foo/bar -rf。这样,如果我不小心按了Enter键,而又没有键入整个路径,则该命令不是递归的,因此可能无害。如果我在尝试在/foo之后键入斜杠时碰到Enter,那么我写的是rm /foo而不是rm -rf /foo。允许这样放置选项。幸运的是,我不经常使用此类系统。

#14 楼

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

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

#15 楼

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


在终端窗口中键入ls /path/to/intented/file_or_directory,然后按return(或根据需要,选择Tab)以查看文件列表。 />
如果一切正常,请单击up arrow键以再次从终端历史记录中获取ls /path/to/intented/file_or_directory
ls替换为rmrm -rrm -rf,需要。我个人不喜欢使用-f标志。

此验证过程还可以防止rm命令的过早执行,这在我开始遵循此过程之前就已经发生了。 >

评论


在删除文件之前先预览文件是一个好主意,而且有一种更安全,更富有表现力的方式,可以使用我在答案中解释的发现来进行处理。

– aculich
2012年2月26日在6:53

#16 楼

避免使用水珠。在Bash中,您可以设置noglob。但是同样,当您移至未设置noglob的系统时,您可能会忘记并继续进行设置。
使用文件浏览器进行删除。某些文件浏览器提供了垃圾箱(例如Konqueror)。

另一种避免阻塞的方法如下。在命令行中,我noclobber。然后,我用Vim或vi编辑文件,以检查要删除的文件(监视文件名中的文件名模式字符。),然后使用mv将每一行变成删除命令。来源xxx。这样,您可以查看要删除的每个文件,然后再执行操作。

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

评论


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

– aculich
2012年2月26日在7:14

#17 楼

我喜欢Windows的回收站方法。

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

mkdir /tmp/recyclebin


从不使用rm -rf,我总是使用:

mv target_folder /tmp/recyclebin


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

#18 楼

ZSH在执行rm -rf *之前会问我(默认情况下)。
ZSH还提供了插件(zsh-safe-rm)来添加safe-rm功能,以便rm会将文件放入操作系统的垃圾桶中,而不是永久删除它们。 br />

#19 楼

除了此处的所有其他解决方案之外,在执行较大的rm时,通常使用-v标志可以查看正在删除的内容,如果我有一点疑问的话,可以快速地进行^C的操作。并不是防止rm损坏的有效方法,但是在发生问题时,这可以用来限制损坏。

#20 楼

chattr之外,让root运行这样的命令并没有很多保护措施。这就是为什么在特权运行时正确的组和谨慎的命令很重要的原因。
下次;扩大要删除的文件的范围-从rm -rf省略'f'或使用find并将其传递给xargs rm

评论


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

– aculich
2012年2月26日5:54

我的意思不是关于xargs的细微差别,而是先使用find,而不删除文件然后继续。

–瘦身
2012年2月26日在7:33

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

– aculich
2012年2月26日在8:05

#21 楼

为了防止类似的灾难,可以在此处找到其他命令的一些安全别名:

# 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选项不会回显您要删除的内容。

–卡尔马留斯
13年1月31日在11:24

#22 楼

如果您现在不打算养成新习惯,那么.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
2012年2月26日在7:17

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

– kln
2012年2月26日17:57



我了解您正在尝试使用set -f(相当于Bash中的set -o noglob)做什么,但这仍然不能解释您的声明“关于它的好处是它只是Bash”。相反,您可以根本不使用rm而是使用find命令,以一种通用的方式对任何外壳完全解决该问题。您是否实际尝试过该建议,以查看它与您在此处提出的建议相比如何?

– aculich
2012年2月26日在18:27

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

– kln
2012-2-26在18:29

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

– kln
2012年2月26日在18:40

#23 楼

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

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

文本版本(压缩):

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


图像版本(完整):



#24 楼

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

首先,键入rm -rf *rm -rf your/path/*,不要键入Enter键。 (当然,您应该养成习惯,不要在使用rm -rf时快速/意外地按Enter键)。然后按Alt-Shift-8(即Alt-Shift-*)在bash中显式扩展“ *”通配符。这也避免了在浏览历史记录时重新输入“ rm -rf *”命令。

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

完成。

#25 楼

万一这有助于某人解决自己的情况:

1。使用rmsafe

它将文件移动到“废纸folder”文件夹,您总是可以通过简单的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

#26 楼

呵呵(还没试过,还有些滑稽!):

$ 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"


实际上,您应该在使用glob执行此类操作之前,请先暂停一下,无论您是以root身份运行,在其之前添加“ sudo”等。您都可以在同一个glob上运行“ ls”,等等,但是,在精神上,您应该停下来一秒钟,确保您键入了想要的内容,确保您想要的实际上是您想要的内容,等等。就像热炉是个好老师一样,告诉您炉子上的东西可能很热。

并确保备份良好!

评论


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

–瓦伦丁·内姆切夫(Valentin Nemcev)
2011年12月2日在17:57

#27 楼

另外,并不是为了保护自己,而是为了找出在命中^ C之前删除了哪些文件的方法,可以使用locate数据库(当然,只有在rm已安装并幸存的情况下),才可以使用。

I从这篇博客文章中了解到了它

#28 楼

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


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

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

#29 楼

与其说是一个答案,不如说是一个小窍门,我总是做rm (dir) -rf而不是rm -rf (dir),即:直到最后一刻都不要去核。一种仍然有效的删除方式,例如滑动并敲击Enter键。

评论


很聪明,但不适用于BSD rm,因为BSD rm必须在文件名之前添加选项。

– gnucchi
18年6月18日在11:44

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

– Sirex
18年6月18日在21:55

可以破解时为什么要扔它? ;)

– gnucchi
18年6月22日在14:47

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

– Sirex
18年6月24日在21:23

#30 楼

我只是简单地编写了自己的脚本,可以针对每种情况简单地发出警告并进行确认,具体取决于您如何改进它:


检查特定的标志和路径
移到垃圾箱并在一段时间后删除
垃圾箱中的空旧物

因此,简单的可自定义脚本可以具有任何特殊的行为,并避免安装任何其他软件包。

借助一些bash知识,您只能丢弃某些特定的东西。