如何删除文件名以短划线(连字符或减号)开头的文件-?我被放入远程OSX服务器中,并且该文件位于我的目录中:

这个问题有时会以不同的形式出现,这些文件易于创建,但很难消除。

我尝试使用反斜杠

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


我尝试使用引号

rm \-\-help


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

评论

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

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

我发现rm --help确实解释了如何删除以-开头的文件名,这有点讽刺。还是好问题。

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

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

#1 楼

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

rm -- --help


评论


我知道这很简单...

–布莱恩·瑞贝因(Bryan Rehbein)
2010年9月2日,19:37

rm命令的所有版本都支持-参数吗?

–基思·汤普森(Keith Thompson)
2011年12月6日7:18



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

– dtech
2013年4月6日17:00



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

– raskhadafi
2013年12月2日8:46



@ dtech,getopt()和-早于GNU(SysIII,1980),是标准/ POSIX。除了一些例外情况(例如echo),标准实用程序都了解-。如果其他命令未使用getopt()API解析选项,则为YMMV。

–StéphaneChazelas
2015年6月17日12:08



#2 楼

或者您可以

rm ./--help


评论


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

–user603
2010-09-21 4:12

即使对于不予处理的命令,此方法也始终有效-特别是。

– jw013
2011-12-26 21:47

而且它还可以避免某些命令对某些类型的特殊命名参数(如选项旁边)进行特殊处理,例如文本实用程序或cd的-,awk的foo = bar ...

–StéphaneChazelas
15年6月17日在10:31

当文件以单破折号开头(rm-没有)时,此方法有效。

– StockB
17年10月31日在14:31

不错的解决方案,还可以提供帮助:mv ./--help / tmp /

– muenalan
18年4月21日在5:52

#3 楼

使用find可以做到这一点:

find . -name '--help' -delete


这是一个很好的方法,因为如果您有更多这样的文件,可以删除这些文件,就可以得到一个预览列表。通过简单地先运行没有-delete选项的find命令来查找文件,然后如果文件列表看起来不错,只需使用-delete再次运行它即可。首先预览)是一个好习惯,它将帮助您避免因rm错误而终日难免咬伤您。

请注意,该查找将遍历所有子目录,因此您可能需要运行它具有子目录深度约束,如下所示:

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


将查找限制为当前目录。

评论


可移植的是,您需要找到要查找的文件/目录的列表。所以找到。 -name .... -delete和-maxdepth也不是标准选项。

–StéphaneChazelas
15年6月17日在12:17

#4 楼

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

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

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


由于inode号在每个文件系统中都是唯一的,因此您可以使用此文件来删除任何文件; unicode或使用转义字符。这是非常烦人的输入方式,所以如果您使用bash,我建议将
TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards



这行添加到您的.inputrc文件中。这使您可以循环浏览可能的完成列表(以获取更多信息)。

评论


这种方式有两个问题:1)可以使用-delete时不要使用-exec rm; 2)获得inode并使用它时,您只需使用它就可以使它变得过于复杂:find -name'--help'-delete

– aculich
2011年12月6日在1:36



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

–基思·汤普森(Keith Thompson)
2011年12月6日,7:16

@KeithThompson find在所有文件的命令行参数路径之前添加前缀,因此它将运行rm ./--help和rm ./sub/dirs/--help。要解决第二个问题,必须添加-maxdepth 1,但是所有这些本质上都是以一种更加round回,复杂的方式应用@edfuh的解决方案,无论如何,-delete比-exec rm更安全。

– jw013
2011-12-26 21:39



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

– Eugene S
2012年5月22日14:08

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

–StéphaneChazelas
15年6月17日在12:16

#5 楼

一个残酷的解决方案:

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

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


#6 楼

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

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

如果要删除的文件中包含星号或斜杠,请不要意外地泵入./**或一些其他通配符级联删除您的操作系统。

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

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


首先,使用以下命令找到它:

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


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

,然后传递-delete选项进行查找,将其删除:

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


它消失了。

#7 楼

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

评论


OP需要命令行(CLI)解决方案。

–user22304
2012年9月14日下午13:11

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

– daviewales
2013年9月20日下午0:41

apt-get install mc ||如何yum install mc; mc各种箭头键和F8比rm ./--帮助容易吗?

–乔什
2014年12月11日下午16:33

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

– Peter.O
2015年8月17日在21:33



#8 楼

这是我在找到此线程之前使用的解决方案。
使用vim到'edit'目录:点击del并确认删除。
完成后,用:q退出vim

#9 楼

您是否尝试过将目录名称添加为前缀:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste


通常,使用目录作为文件的前缀有助于避免错误地将“减号”解释为解析器功能提供的命令选项。

评论


我相信先前的答案已经涵盖了这一点。

– Kusalananda♦
18年4月4日在11:37

#10 楼

如果要重命名文件-.bar(mv无法工作),请尝试以下操作:

cat >foo.bar <-.bar


,然后再使用命令:

rm -- -.bar


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

评论


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

– jw013
2011-12-26 21:42

您可以使用vidir;但这可能效率低下(甚至更高),而且更加危险。

–斯蒂芬·梅纳斯(Stephen Menasian)
2011-12-27在0:22