我不记得我列出了多少次子目录并/bin/rm -f *
在当前目录中执行。谁能提出建议来帮助我避免这种情况?如果我希望系统在我尝试执行时警告我有危险,我该怎么办/bin/rm -f *
?
答案1
zsh
默认情况下,当您尝试在命令行上运行任何rm
以*
整个单词形式调用的命令时,系统会要求您确认(该功能继承自tcsh
,但tcsh
默认情况下未启用)。
$ rm -rf *
zsh: sure you want to delete all the files in / [yn]?
如果你必须使用 bash,使用最新版本的bash
,你可以通过使用extdebug
和DEBUG
trap 来做一些接近的事情:
shopt -s extdebug
check_for_rm_star() {
case $1 in
(rm*[\ /]"* "* | rm*[\ /]\*)
read -p "check_for_rm_star: Are you sure? " -n1 answer < /dev/tty > /dev/tty
echo > /dev/tty
[[ $answer == [yY] ]]
esac
}
trap 'check_for_rm_star "$BASH_COMMAND"' DEBUG
这是一个简单的方法,适用于rm *
和 最常见的情况,但不适用于rm "*"
or/bin/rm *
或: $(rm *)
,但您明白了。理想情况下,我们需要$BASH_COMMAND
像 shell 一样解析 was ,看看第一个参数是否扩展为rm
or */rm
,并查看它是否传递了一个不带引号的*
,但这实际上不能以一种防弹的方式完成。
答案2
一种可能性是创建一个 shell 别名来映射rm
到破坏性较小的命令。例如:
alias rm='trash' # from the package trash-cli
这不会删除文件,而是将它们放入垃圾箱中,以便您可以恢复它们。但是,这会更改命令的语义(例如,rm
您可以删除整个目录而不使用)。-r
此外,如果使用完整路径也没有帮助。
另一种可能性是设置定期备份,例如每小时一次。这样您就可以愉快地删除文件并在以后恢复它们。
答案3
唯一的方法是替换 rm 本身。
有一个 rm 的包装脚本,旨在提供安全的 rm,可以在以下位置找到:发射台。从该页面:
Safe-rm 是一种安全工具,旨在通过用包装器替换 /bin/rm 来防止意外删除重要文件,该包装器根据永远不应删除的可配置文件和目录黑名单检查给定参数。
我看到的唯一问题是您的示例“危险”rm 示例是使用完整路径运行的/bin/rm
。因此,您无法将此包装器脚本放在 $PATH 中较早的目录中,并在运行 rm 时找到它,并通过键入完整路径 /bin/rm 来获得未包装的“正常”rm,如下所示做上面的。
答案4
一个简单的解决方案是添加alias rm="rm -i"
,然后在每次删除之前都会询问您是否确定。但是,正如我的一位老师所指出的,这可能会欺骗你,你正在使用的 UNIX 系统是一个安全而温暖的地方,这可能比意外运行更危险rm *