如何“删除”名为“-”的文件?


17

我不小心创建了一个名称为-(例如seq 10 > -)的文件。然后我尝试使用less它来查看它,但是它只是挂起了。

我知道发生这种情况是因为less -期望从输入stdin,所以它不会将解释-为文件名。我试过了,less \-但是也不行。

那么,有没有办法表明less-是文件而不是stdin?

我能得到的最好的是:

find -name '-' -exec less {} +

2
@muru感谢您的评论,但可能的重复是如此具体,以至于我认为它不符合“完全重复”的条件。如果将它改写为更通用的名称,例如“如何访问以'-'开头的文件”。
fedorqui 2015年

4
这不是重复的问题。-单独的情况是不同的。-不是一个选择。
斯特凡Chazelas

1
@terdon我不认为直接拥有相同的答案就意味着它们是重复的。Meta SO中有一个示例:如果问题的答案为“否”,那么正确答案为“否”的任何内容是否会重复?正如我之前说过的那样,用重复的单词改写候选单词很有趣,这样它可以更通用。否则,将诸如此类的其他问题发送到那里没有多大意义。
fedorqui 2015年

4
@terdon,不。那里接受的解决方案在这里行不通。不,-不被视为选项,这与恰好是选项的参数的情况完全不同。
斯特凡Chazelas

2
不必-在单引号之间加上'-'或将其转义,\-因为-对于普通shell(至少是POSIX兼容的shell)而言,它不是特殊字符。结果是一样的。
pabouk

Answers:


53

只需加上./

less ./-

或使用重定向:

less < -

请注意,由于-(相对于-x--foo--(例如))被视为特殊文件名而不是选项,因此以下操作无效:

less -- -   # THIS DOES NOT WORK

3
顺便说一句,那就是find -name '-' -exec less {} +运行。
斯特凡Chazelas

6
@fedorqui,不,只是-and和./-(或/path/to/-or ../to/-)是该-文件的两(4)个有效路径,但自-变量是特殊的less(表示从stdin读取),而./-并非特殊。
斯特凡Chazelas

2
@fedorqui find -name '-' -exec less {} +是的非标准格式find . -name '-' -exec less {} +。它将树.降到并找到文件,并将这些文件的路径作为参数传递给less。替换-exec less-exec echo less以查看正在运行的内容。
斯特凡Chazelas

4
@haylem,--是为了标记选项的结束。在这里没有帮助。那-不是一个选项,它是一个特殊的非选项参数。又见unix.stackexchange.com/a/56370unix.stackexchange.com/a/110756
斯特凡Chazelas

3
@haylem,自己尝试。--由getopt()处理以标记选项的结尾,-getopt()不-将其识别为选项,因此无论是否--提供,都将其识别为常规参数。作为一般参数,less像大多数文本实用程序一样,它将其视为标准输入,我们在这里不需要。
斯特凡Chazelas


3

注:我的答案是不是在OP的情况下有效,且仅适用于工具以下约定命名究竟只是一个文件的情况下,下方未提及-(DASH)的特殊情况,这往往也是指定从标准,阅读期望输入。请参阅已接受的答案。

将其保留在此处,因为它包含了在寻找答案时可能偶然发现的其他情况的有用信息。


双重破折号!

使用标准的双破折号(--)约定来表示最后一个参数:

less -- -FILENAME

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

哇哈

--参数源于Shell实用程序和命令行工具的大多数实现所支持的约定,并且大多数Shell显然主张在实现CLI工具时应遵循该约定。

开放小组推荐

OpenGroup还在其基本规范的“ 实用程序描述默认值(v6)”部分中提到了它:

默认行为:不接受选项但接受操作数的标准实用程序应将“-”识别为要丢弃的第一个参数。

识别“-”的要求是因为符合标准的应用程序需要一种方法来屏蔽其操作数,使其不受实现可能提供的任何扩展选项的影响。例如,如果标准实用程序foo被列为不带任何选项,并且应用程序需要为其指定路径名并带有前导连字符,则可以安全地执行以下操作:

foo -- -myfile

并避免将-m用作扩展名。

实用程序语法准则(v7)中:

准则10: 不是选项参数的第一个参数应作为表示选项结束的定界符而接受。以下任何参数都应视为操作数,即使它们以'-'字符开头。

Bash推荐

从bash手册中摘录的有关支持它的内置文件的内容如下:

除非另有说明,否则本节中记录为接受选项的每个内置命令均以-接受-开头,表示这些选项的结尾。

:,true,false和test内置函数不接受选项,也不对其进行特殊处理。退出,注销,中断,继续,让和移位内置函数接受并处理以-开头的参数,而不需要-。其他接受参数但未指定为接受选项的内建函数将以-开头的参数解释为无效选项,并要求-防止这种解释。

请注意,echo不会解释-表示选项的结尾。

附加阅读


2
+1:最便携且独立于命令的解决方案,易于记忆,并被视为“最佳实践”
mveroone

2
@Kwaio关于“最佳实践”的任何参考吗?只是对此感到好奇。
fedorqui

24
该答案适用于看起来像选项的参数。不是这种情况,-这不是一个选择。./-尽可能使用或重定向通常是更好的方法,因为它避免了诸如foo=barof awk或that之类的其他问题-。又见unix.stackexchange.com/a/56370unix.stackexchange.com/a/110756
斯特凡Chazelas

7
正如斯特凡说,这并不能回答问题。less -- -仍会尝试从stdin中读取。
米哈尔Politowski

5
您可能想要删除答案(或将其移至其他问题,因为此处提供了有用的参考)或明确指出该答案不适用于此特定情况(并解释为什么这样做会更加有用)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.