意图:
rm -rf string*
问题:
rm -rf string *
第一种情况是 rm 的合法且常见用法,在第二种情况下,一个小的拼写错误可能会导致很多问题。有没有一种简单的方法可以巧妙地防止意外的尾随或前导通配符?
答案1
可以编写一个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
根据需要调整逻辑。
(我实际上并不指望这种方法有用——有太多方法会破坏性地弄乱一个命令,而只能逐一进行测试——但它为这个问题提供了一个字面上的答案)。
答案2
没有任何方法可以完全确保系统万无一失。在事情中添加“你确定吗?”提示不仅适得其反,还会导致“我当然确定”的下意识反应。
我几年前从一本书中学到的一个技巧是ls -R blah*
,先执行然后 rm -fr blah*
当且仅当 ls 出现的列表符合我想要的内容时才执行。
这很简单,先执行ls
命令,然后↑删除ls -R
并替换为rm -fr
。
最后一个问题是:“如果这些信息对你来说很有价值,那么你的备份在哪里?”
答案3
你能训练自己使用 来代替rmrf
吗rm -rf
?
如果是这样,这个 bash 函数将让你有机会在确认命令之前查看实际发生的情况:
rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }
为了使此功能永久生效,请将此行添加到~/.bashrc
您使用的每台计算机上的文件中。
与常见rm
别名的比较
定义别名很常见:
alias rm='rm -i'
这有两个限制:
如果您依赖此别名,那么当您在没有该别名的机器或环境中时,您会大吃一惊。相比之下,尝试在
rmrf
没有该函数的机器上运行将返回无害的command not found
。这个别名对您没有帮助,因为
-f
您在命令行上提供的选项会覆盖-i
别名中的选项。
答案4
我认为,不必使用两个命令(ls
和rm
),更简单、更轻松的方法是使用find
:
find . -maxdepth 1 -name "string*" -delete
如果您不小心输入,"string *"
它将删除名为string chars
和的文件string letters
(无论如何这都是您想要的),但它不会像*
在 shell 中那样抓取每个文件。
另外,您可以停下来-delete
看看要删除哪些文件,然后按向上箭头并输入,这-delete
比打字^ls -R^rm -rf
或其他废话更容易。