意图:
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。
最后一个问题是,“如果这些信息对您很有价值,那么您的备份在哪里?”
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)
根据口味调整逻辑。
(我实际上并不希望这种方法有用——有太多方法破坏性地弄乱命令以找到它们一个接一个地测试——但它为问题提供了一个字面的答案)。
你能训练自己使用,比如说,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)
这有两个限制:
如果您开始依赖这个别名,那么当您在机器上或没有它的环境中时,您会感到震惊。相比之下,尝试rmrf在没有该功能的机器上运行将返回一个无害的command not found.
此别名对您的情况没有帮助,因为-f您在命令行上提供的-i选项会覆盖别名中的选项。
如果我在的情况下删除错误的文件确实是一个大问题,我所做的就是做一个垃圾桶文件夹,想的事情之一mkdir trashcan,然后我有一个脚本,rmTrashcan其中有一个rm -rf trashcan/*或rm -rf *或类似的,写的很仔细,检查了几次。
这样,如果我犯了一个错误,错误就在mv命令上,而不是rm命令上。一旦我做了ls,并有信心的正是我所删除,一个rmTrashcan实际上做肮脏的工作安全。
对于必须删除备份的情况,这也非常方便。我可以将mv一整个月的备份放入垃圾桶,mv我想保留的少数(一个月的第 1 天,第 15 天)回到备份中,然后rmTranshcan是其余的。单独执行类似的命令是很难做到rm的,这样做可以让我ls的备份对我留下的文件充满信心(而不仅仅是枚举我打算删除的文件)