防止用户在 rm 和通配符之间输入意外空格

bob*_*ole 29 linux bash rm

意图:

rm -rf string*
Run Code Online (Sandbox Code Playgroud)

问题:

rm -rf string *
Run Code Online (Sandbox Code Playgroud)

第一种情况是 rm 的合法和常见用法,在第二种情况下,一个小的错字可能会导致很多问题。是否有一种简单的方法可以巧妙地防止意外的尾随或前导通配符?

kil*_*ist 46

没有办法让系统完全防弹。并添加“你确定吗?” 对事情的提示既适得其反,又会导致“我当然确定”。膝跳反应。

我在过去几年从一本书中学到的一个技巧是先做ls -R blah*然后,rm -fr blah* 当且仅当 ls 出现的列表符合我想要的目标时才做 。

首先执行ls命令很容易,然后?删除ls -R并替换为rm -fr

最后一个问题是,“如果这些信息对您很有价值,那么您的备份在哪里?”

  • 您可以使用 `^ls -R^rm -rf^` 而不是向上箭头,并且可以设置为别名 (4认同)

Cha*_*ffy 37

DEBUG可以编写一个陷阱来取消看起来可疑的命令。可以将以下内容或类似的代码添加到您的~/.bashrc:

shopt -s extdebug
checkcommand() {
  if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then
    echo "Suppressing rm -r command ending in a wildcard" >&2
    return 1
  fi
  # check for other commands here, if you like
  return 0
}
trap checkcommand DEBUG
Run Code Online (Sandbox Code Playgroud)

根据口味调整逻辑。

(我实际上并不希望这种方法有用——有太多方法破坏性地弄乱命令以找到它们一个接一个地测试——但它为问题提供了一个字面的答案)。


Joh*_*024 8

你能训练自己使用,比如说,rmrf代替rm -rf吗?

如果是这样,这个 bash 函数将使您有机会在确认命令之前查看实际发生的情况:

rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }
Run Code Online (Sandbox Code Playgroud)

要使此功能永久化,请将此行添加到~/.bashrc您使用的每台计算机上的文件中。

与常用rm别名的比较

通常定义别名:

alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)

这有两个限制:

  1. 如果您开始依赖这个别名,那么当您在机器上或没有它的环境中时,您会感到震惊。相比之下,尝试rmrf在没有该功能的机器上运行将返回一个无害的command not found.

  2. 此别名对您的情况没有帮助,因为-f您在命令行上提供的-i选项会覆盖别名中的选项。

  • 不错的主意。但这取决于此用户正在使用的任何系统上安装和可用的此功能。因此,假设他们登录远程服务器进行某些工作并运行错误的 `rm -rf` 命令,会发生什么?创建这样的伪函数最终只会使一个简单的解决方案复杂化:只要更加小心并了解什么是权限。 (4认同)
  • @JakeGould 并且*不要使用 rm -f 除非你真的需要*。 (4认同)
  • 您使用不同的名称,这样当您的覆盖不在时,您就不会用脚射击自己。我同意@MichaelKjörling,如果你没有`-i`,你就不需要`-f`。例如,在删除只读文件之前,离开 `-f` 会给你额外的警告。 (3认同)

Cor*_*mon 6

如果我在的情况下删除错误的文件确实是一个大问题,我所做的就是做一个垃圾桶文件夹,想的事情之一mkdir trashcan,然后我有一个脚本,rmTrashcan其中有一个rm -rf trashcan/*rm -rf *或类似的,写的很仔细,检查了几次。

这样,如果我犯了一个错误,错误就在mv命令上,而不是rm命令上。一旦我做了ls,并有信心的正是我所删除,一个rmTrashcan实际上做肮脏的工作安全。

对于必须删除备份的情况,这也非常方便。我可以将mv一整个月的备份放入垃圾桶,mv我想保留的少数(一个月的第 1 天,第 15 天)回到备份中,然后rmTranshcan是其余的。单独执行类似的命令是很难做到rm的,这样做可以让我ls的备份对我留下的文件充满信心(而不仅仅是枚举我打算删除的文件)