如何删除名称以“-”开头的文件(连字符,即连字符或减号)?


348

如何删除文件名以破折号(连字符或减号)开头的文件-?我被放入远程OSX服务器中,并且我的目录中有以下文件:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

我该如何--help从CLI 删除?我有时会以不同的形式遇到此问题,这些文件易于创建,但很难消除。

我尝试使用反斜杠

rm \-\-help

我已经尝试过引号

rm "--help"

如何防止减号(连字符或连字符)被解释为选项?


1
如果将此问题重命名为“如何删除名称以-开头的文件”,那就太好了。
桑迪2010年

@桑迪同意; 我通常不喜欢更改问题的含义,但是在这种情况下,可接受的答案特定于此问题
Michael Mrozek

33
我觉得有点讽刺,rm --help实际上解释了如何删除以-。开头的文件名。不过,这是个好问题。
lesmana'9

1
@ jw013有时,有经验的用户可以轻松地获得帮助,但对于新手来说却不知所措。
iconoclast 2012年

1
我在使用BusyBox的rm的系统上遇到了这个问题。包括帮助在内的一切都很少,因此rm --help没有提供任何线索。
dslake

Answers:


497

使用“-”使rm停止解析命令行选项,如下所示:

rm -- --help

1
我知道这很简单……
Bryan Rehbein 2010年

2
rm命令的所有版本都支持该--参数吗?
基思·汤普森

3
@KeithThompson-是大多数GNU工具的功能,因此它不适用于大多数非GNU(“非Linux”)Unix(例如BSD变体或某些嵌入式系统)
dtech

1
谢谢!那挽救了我的一天。当然,它可以在BSD(OSX)和其他命令上运行!
raskhadafi

8
@ dtech,getopt()和--GNU(SysIII,1980)之前是标准/ POSIX。除了一些例外情况(如echo),标准实用程序都可以理解--。如果其他命令未使用getopt()API来解析选项,则为YMMV。
斯特凡Chazelas

213

或者你可以做

rm ./--help

7
没关系,但这似乎是最“正确”的。
James M.

2
这是我记得的那个。我总是必须使用“ rm---help”。
user603 2010年

25
即使对于不--特别对待的命令,此方法也始终有效。
jw013 2011年

而且它也可以以避免对其他类型的一些特殊对待(选项旁)特别命名的参数,如-文本或实用工具cdfoo=barawk...
斯特凡Chazelas

1
当文件以单破折号开头(而不是破折号)时,此方法有效rm -- <filename>
StockB

37

使用find它来做:

find . -name '--help' -delete

这是一个很好的方法,因为如果您有多个这样的文件可以删除,则可以通过简单地先运行find而无需-delete选择该选项来获得文件的预览列表,然后如果文件列表看起来不错就可以运行再次与-delete

实际上,避免rm使用find(尤其是先预览)是一个好习惯,它将帮助您避免犯错,rm *这不可避免地会折磨您一天。

但是请注意,该查找将在所有子目录中递归,因此您可能需要使用子目录深度约束来运行它,如下所示:

find . -maxdepth 1 -name '--help' -delete

这将查找限制为当前目录。


可移植的是,您需要提供find要查看的文件/目录的列表。所以find . -name...-delete-maxdepth不是标准的选择无论是。
斯特凡Chazelas

21

Vegar Nilsen和edfuh的答案非常好,并且是对此类问题的正确解决方案。

我确实想对此问题添加一个一般性的答复,以使您可以删除文件名困难的任何文件。首先使用ls -i或的某种形式获取其inode编号stat,然后通过使用inode编号在当前目录中搜索文件并rm在具有匹配的inode编号的文件上执行命令来删除文件

find . -inode <inode> -exec rm {}\;

由于inode编号在每个文件系统中都是唯一的,因此您可以使用此文件删除任何文件;unicode或使用转义字符。这是非常烦人的输入方式,所以我建议添加该行

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

.inputrc如果您正在使用bash,则将其放入文件中。这使您可以循环浏览可能的完成列表(以获取更多信息)。


5
这种方式有两个问题:1)可以使用-delete时不要使用-exec rm;2)当您可以使用时,获取find -name '--help' -delete
索引

我认为那行不通。它遍历当前目录及其所有子目录中的所有文件,并且毕竟仍会调用rm --help,但仍不会删除该文件。只要使用rm ./--help(或rm -i *
基思·汤普森

1
@KeithThompson find在所有文件的命令行参数路径前添加前缀,因此它将运行rm ./--helprm ./sub/dirs/--help。要解决第二个问题,必须添加-maxdepth 1,但是所有这些实质上都是以一种更加绕行,复杂的方式应用@edfuh的解决方案,并且-delete比以往任何时候都更安全-exec rm
jw013 2011年

1
此命令的另一个问题是{}和之间必须有一个空格\;,否则它将不起作用。
Eugene S

索引节点可能是唯一的,但可能有多个具有相同索引节点的目录条目。这些称为硬链接。而且它们在每个文件系统中都是唯一的,因此您需要使用-xdev。那帮不了你ls -i --help
斯特凡Chazelas

11

一个残酷的解决方案:

perl -e "unlink '--help' or die 'Could not unlink.';"

perl -e "rmdir '-d' or die 'Could not rmdir.';"

8

Linux演练:创建一个带有破折号和空格的文件,然后将其删除。

小心!不要意外地运行一个rm -rf /或类似的级联删除命令。

如果您要删除的文件中包含星号或斜杠,请不要意外插入./**其他通配符,它​​们可能会级联删除您的操作系统。

创建一个名为“ --yo yo”的文件

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

首先,使用find查找它:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

确保find命令仅找到您要删除的一个文件:

然后通过-delete选项进行查找,以将其删除:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

啊,它走了。


2

午夜指挥官(mc)是最简单的,只需指向它并按F8;)


3
OP需要命令行(CLI)解决方案。
Francesco Turco 2012年

1
Midnight Commander是一种CLI解决方案。只需使用您的软件包管理器进行安装即可。(甚至可以在ssh上使用...)en.wikipedia.org/wiki/Midnight_Commander
daviewales

6
如何为apt-get install mc || yum install mc; mc 不同的方向键和F8不是更容易rm ./--help
2014年

3
@daviewales:Midnight Commander是从命令行启动的,并且在终端中运行,但是Midnight Commander中的所有键盘操作都不来自CLI(命令行界面),而是来自Midnight Commander的界面。-通常,命令行实用程序可以在脚本中运行(bash命令行历史记录除外)
Peter.O 2015年

1

这是我在找到此线程之前使用的解决方案。
用于vim“编辑”目录:

vim .

然后(在vim中)选择您的文件,点击del并确认删除。
完成后,退出vim:q



-3

如果要重命名文件(-.bar,mv将不起作用),请尝试以下操作:

cat >foo.bar <-.bar

使用命令之前:

rm -- -.bar

您应该能够在foo.bar中检查原始文件的内容


4
复制文件不是重命名文件的非常有效的解决方案。
jw013 2011年

1
您可以使用vidir; 但这可能效率低下(甚至更高),而且更加危险。
Stephen Menasian 2011年
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.