意图:
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
的备份对我留下的文件充满信心(而不仅仅是枚举我打算删除的文件)
归档时间: |
|
查看次数: |
3938 次 |
最近记录: |