我需要删除所有具有这些名称的文件(引号是名称的一部分):
'index.html?some-query-string'
我尝试过:
rm \'index.html?*\'
我收到此错误:
rm: cannot remove ''\''index.html?*'\''': No such file or directory
答案1
分析
引号是名称的一部分
你确定吗?你怎么知道?有这个现代 GNU 的“特性”ls
,因此它会打印带有附加引号的名称,其中有像?
里面的字符;因此,当一个完全的门外汉复制粘贴'index.html?some-query-string'
并运行时,例如rm 'index.html?some-query-string'
,这将是正确的安全命令。
不幸的是,这可能会让更精明的用户感到困惑,因为他们知道应该引用/转义某些字符。您的rm
命令 ( rm \'index.html?*\'
) 对于带引号的名称没有问题。由于是?*
glob 模式,它可能匹配更多文件名;我假设这就是您想要的,因为您写了“我需要删除所有文件”。命令给您的事实No such file or directory
让我相信现有名称确实不同。
要确认这一点,请运行ls -N
。如果此命令成功并打印名称,如index.html?some-query-string
不带引号然后这些都是真名。
解决方案
答案的这一部分假设您ls
是现代 GNUls
或类似的“智能”,因此所讨论的引号不属于文件名。
要删除某个文件,请充当一个'index.html?some-query-string'
在“smart” 的输出中看到的普通人ls
,或者充当一个需要引用的用户(我相信你是)index.html?some-query-string
在 的输出中看到的普通人ls -N
。运行:
rm 'index.html?some-query-string'
或者,如果您想删除所有以 开头的文件index.html?
:
rm 'index.html?'*
shell 将删除引号,它们将不会到达rm
。单引号?
将不会被视为通配符,它将按字面意思传递rm
。不带引号的*
将被视为通配符,它将匹配任何查询字符串,shell 将传递可能多个匹配的文件名作为 的参数rm
。
答案2
如果'
是文件名的一部分,我建议使用 find 命令以及" "
传递命令的名称模式。
您可以使用的一个例子是:
find . -maxdepth 1 -type f -name "'index.html?*'" -exec rm {} \;