我实现了以下命令来创建名为*
(星号)的文件:
echo > '*'
现在我应该在不使用任何引号的情况下删除此文件。
我知道如何使用引号将其删除,但不确定如何不使用引号。
我尝试了以下命令,由于命令行扩展,我确信它们不会起作用:
rm ./*
rm /*
如果有人可以帮助我,我将不胜感激。
答案 0 :(得分:2)
我认为您应该自己解决这个问题:-)
不涉及报价的最简单解决方案是使用模式[*]
。 Shell中的括号表达式的工作方式与正则表达式中的字符类非常相似,因此它将与名称为单个字符*
的文件匹配。因此,您可以使用
rm [*]
请注意,您不能使用该模式来创建名为*
的文件,因为外壳程序会将包含模式的单词替换为与该模式匹配的文件的名称;如果不存在这样的文件,则模式不匹配并且不执行替换。因此,如果没有名为*
的文件,那么touch [*]
将创建一个名为[*]
的文件。
答案 1 :(得分:1)
您可以使用history expansion。如果rm
命令紧随echo
命令之后,则可以使用!$
:
echo > '*'
rm !$
!$
是!!:$
的简写:重复最后一个命令($
)的最后一个词(!!
)。
如果echo
和rm
命令之间存在命令,则可以使用fc -l
查找历史记录编号:
$ echo > '*'
$ cmd1
$ cmd2
$ cmd3
$ fc -l
[...]
27628 echo > '*'
27629 cmd1
27630 cmd2
27631 cmd3
$ rm !27628:$
!27628
扩展到历史记录中具有该编号的命令,而$
再次是该命令的最后一个单词。
如果必须在脚本中运行此命令,则不能真正查找命令号并插入它,但是可以计算echo
和rm
之间的命令数,并且使用相对事件指示符:
echo > '*'
cmd1
rm !-2:$
其中!-2
指的是命令行后两行。请注意,默认情况下,非交互式外壳中的历史记录扩展是禁用的;使用
shopt -o history
启用它。
答案 2 :(得分:0)
如果文件数量不太大,则可以使用rm -i *
。这将要求对每个文件进行确认。确认仅删除文件*
并删除其他所有文件。