使目录免受“rm -rf”的影响

使目录免受“rm -rf”的影响

我刚刚丢失了文件夹 A 中的一些数据,该文件夹位于文件夹 B 中rm -rf B。在我意识到自己做了什么之前,一切都结束了。现在吸取了教训,我希望让我的一些文件夹防白痴,以避免下次我做类似的事情并想自杀。

我能想到的一种方法是编写一个 bash 函数并将其别名为rm.此函数将在每个子文件夹中查找隐藏文件,例如.dontdelete.找到后,它会询问我是否真的要继续。我无法设置写保护,因为有一个进程不断写入此文件夹。有没有更好的办法呢?

答案1

在研究你的问题时,我发现了这种技术,它可能会在将来对你有所帮助。

您显然可以像这样触摸目录中的文件:

touch -- -i

rm -fr *现在,当您在存在 的目录中运行该命令时,-i您将看到来自 的交互式提示rm

$ ls
file1  file2  file3  file4  file5  -i

$ rm -fr *
rm: remove regular empty file `file1'? n
rm: remove regular empty file `file2'? n
rm: remove regular empty file `file3'? n
rm: remove regular empty file `file4'? n
rm: remove regular empty file `file5'? n

只需保留一个别名 forrm始终执行即可实现相同的效果rm -i。这可能会让人烦恼。我经常看到的做法是先设置此别名,然后在您确实想要删除而没有提示的情况下禁用它。

alias rm='rm -i'

现在在目录中你会受到这样的欢迎:

$ ls
file1  file2  file3  file4  file5

$ rm -r *
rm: remove regular empty file `file1'?

要覆盖别名:

$ \rm -r *

然而这仍然无法阻止rm -fr。但它确实为您提供了一些保护。

参考

答案2

多种可能性:

  • alias rm='rm -i'- rm 会询问 - 除非您指定-f...
  • chmod -w dir- 直接保护该目录中的文件。
  • chattr +i如果你是认真的
  • 围绕 rm 编写自己的包装器
  • ETC...

但更好的方法可能是进行良好的备份并将重要数据保存在某种版本控制中(例如git),这也带来了许多其他优点。

答案3

使用版本控制软件来git封装您的项目。

只要您不删除整个项目,您就必须有目的地键入rm -rf .*以删除.git目录并丢失回滚所需的所有数据。

这还有一个额外的好处,你可以将你的东西的备份推送到远程服务器,比如 github 或 bitbucket。

答案4

我创建了一个脚本来简化此任务。 shell 脚本以交互方式修改给定文件夹列表的读/写权限和 chattr 标志,而无需询问 root 密码。您可以从下面给出的链接下载 zip 文件。

https://drive.google.com/file/d/0B_3UYBZy2FVsMVpBSWdSWnFBYk0/edit?usp=sharing

我还包含了安装脚本以使设置更容易。说明包含在 zip 文件中。

相关内容