删除所有名称以单引号开头的文件

删除所有名称以单引号开头的文件

我需要删除所有具有这些名称的文件(引号是名称的一部分):

'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 {} \;

相关内容