2009-06-12 104 views
1

今天,我第一次看到部分意外删除同事主目录的可能性(在项目关键阶段丢失了2个小时)。 我很担心它开始考虑问题和可能的解决方案。防止意外删除

在他的情况下,一个名为'〜'的文件以某种方式进入了一个测试文件夹,他在用rm -rf删除后...当rm到达文件bash时,它将其展开到他的主文件夹(他设法按下CTRL- C几乎及时)。 如果有一个名为'*'的文件,可能会发生类似的问题。

我的第一个想法是防止创建具有“危险名称”的文件,但这仍然不能解决问题,因为mv或其他角落情况也可能导致危险情况。

第二个想法是创建一个监听器(不知道这是甚至可能)还是rm的别名,它检查它处理的文件,以及它是否发现危险的文件会跳过发送消息。 事情类似:

  1. 采取一切非参数的参数(因此要获得一个要删除的文件)
  2. 周期对这些项目
  3. 检查,如果当前项目是等于危险物品(比如说'〜'或'*'),不知道这是否有效,此时该项目是否已经扩展?
  4. 如果是这样回应的消息,不要做对文件进行任何
  5. 继续进行迭代

三想:有没有人已经完成或作了妥善处理这个? :]

回答

7

将主目录中的重要文件签入源代码管理实际上有很好的理由。除了防止刚刚遇到的情况,还能够对版本控制.bashrc等进行保护。

0

版本控制建议得到我的赞赏。我建议所有的东西,而不仅仅是来源。

另一个想法是备份和归档的服务器上的共享驱动器。

第三个想法是向每个人购买一个单独的外部硬盘驱动器,让他们备份他们的本地驱动器。这是一件好事,因为有两种硬盘驱动器:失败的和未来的。

0

您也可以从rm创建一个别名,该别名通过一个简单脚本运行,该脚本可以转义所有字符,从而有效地阻止您使用通配符。然后创建另一个别名,通过真正的rm运行而不会转义。如果你确定的话,你只能使用第二个。然后再次,这就是rm -rf的要点。

我个人喜欢的另一个选择是创建一个通过脚本重定向的别名,然后将所有内容传递给rm。如果脚本发现任何危险字符,如果您想继续,则会提示您Y/N,N取消操作,Y会继续正常。

2

由于shell可能会扩展参数,因此您无法真正捕获这样的“危险”名称。

您可以将'rm -rf'替换为'rm -rfi'(交互式),但如果您实际上的意思是'rm -rf *',那可能非常乏味。

您可以将'rm'别名为'mv $ @ $ HOME/.thrash',并且有一个单独的命令来清空这个thrash,但是如果您真的想要删除由于磁盘配额导致的文件,类似。

或者,您可以保留适当的备份或使用允许“取消”的文件系统。

+0

你可能是指“垃圾”而不是“thrash”。 – 2009-06-12 13:23:11

2

事故确实发生。你只能减少他们的影响。

这里的版本控制(常规签入)和备份都非常重要。

如果我无法签入(因为它还没有工作),我备份到USB棒。

如果截止日期临近,备用频率增加,因为墨菲在最不适当的时刻罢工。

1

我做的一件事是在我的$ HOME中总是有一个名为“-i”的文件。

我的另一个提示是总是使用“./*”或find而不是普通的“*”。

0

我工作的一家公司有一个cron作业,每半小时运行一次,它将所有源代码文件从每个人的主目录复制到备份目录结构中,只需使用find即可。

这不会阻止实际的删除,但它确实减少了多次丢失的工作量。

0

这真的很奇怪 - 为什么bash扩展两次?

一旦*已扩大到

old~ 
this~ 
~ 

则没有进一步的替代应该发生!

我勇敢地测试了这个在我的mac上,它只是删除〜,而不是我的主目录。

是否有可能你的同事以某种方式编写了扩展它两次的代码?

例如

ls | xargs | rm -rf 
+0

不,不是两次,他只有一个名为'〜'的文件。我添加了'*'的情况,因为它是相似的。 – 2009-06-12 12:10:19

0

您可以禁用文件名生成(通配符):

set -f 

转义文件路径中的特殊字符可以使用bash内建命令来完成:

filepath='/abc*?~def' 
filepath="$(printf "%q" "${filepath}")" 
filepath="${filepath//\~/\\~}" 
printf "%s\n" "${filepath}" 
0

我在用这个〜 /.basrc

alias rm =“rm -i”

rm在删除任何内容之前会提示,并且别名可以通过-f标志或者通过escabing来避开,例如, \ rm文件

降级问题是的;解决它没有。

+0

我认为,这个问题最终让你厌倦了询问每个文件的删除情况,并诉诸于\ rm。所以错误地发布\ rm -rf只是一个时间问题。 – Michael 2011-12-05 22:30:12