月度归档:2020年08月

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

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

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

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

我尝试使用反斜杠

rm \-\-help

我已经尝试过引号

rm "--help"

如何防止减号(连字符或连字符)被解释为选项?shellcommand-linermquotingoptions— 布莱恩·瑞贝因(Bryan Rehbein)
 source
https://googleads.g.doubleclick.net/pagead/ads?guci=2.2.0.0.2.2.0.0&client=ca-pub-0985488874840506&output=html&h=185&slotname=6265911322&adk=3390361236&adf=749455052&pi=t.ma~as.6265911322&w=739&fwrn=4&lmt=1607589096&rafmt=11&psa=1&format=739×185&url=https%3A%2F%2Fqastack.cn%2Funix%2F1519%2Fhow-do-i-delete-a-file-whose-name-begins-with-hyphen-a-k-a-dash-or-minus&flash=0&wgl=1&tt_state=W3siaXNzdWVyT3JpZ2luIjoiaHR0cHM6Ly9hZHNlcnZpY2UuZ29vZ2xlLmNvbSIsInN0YXRlIjo2fSx7Imlzc3Vlck9yaWdpbiI6Imh0dHBzOi8vYXR0ZXN0YXRpb24uYW5kcm9pZC5jb20iLCJzdGF0ZSI6MX1d&dt=1607589096153&bpp=10&bdt=751&idt=92&shv=r20201203&cbv=r20190131&ptt=9&saldr=aa&abxe=1&cookie=ID%3Dca4430823848d327-22b818ace4c4003d%3AT%3D1606204075%3ART%3D1606204075%3AS%3DALNI_Mbkru57lQXIIYRILmLVnNvhJD6RsA&prev_fmts=0x0&nras=1&correlator=2164803063742&frm=20&pv=1&ga_vid=675618944.1606204075&ga_sid=1607589096&ga_hid=1460359480&ga_fc=0&rplot=4&u_tz=480&u_his=1&u_java=0&u_h=864&u_w=1536&u_ah=824&u_aw=1536&u_cd=24&u_nplug=3&u_nmime=4&adx=291&ady=687&biw=1519&bih=754&scr_x=0&scr_y=0&eid=21066699%2C21066792%2C21066435%2C21067496%2C21067981&oid=3&pvsid=3260477188348453&pem=565&ref=https%3A%2F%2Fwww.google.com%2F&rx=0&eae=0&fc=1920&brdim=0%2C0%2C0%2C0%2C1536%2C0%2C1536%2C824%2C1536%2C754&vis=1&rsz=%7C%7CpEe%7C&abl=CS&pfx=0&fu=8328&bc=31&ifi=1&uci=a!1&fsb=1&xpc=yo2WU2lIgm&p=https%3A//qastack.cn&dtd=100


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


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


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


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


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

Answers:


497

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

rm -- --help

— Vegar Nilsen
 source


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

— 埃德富
 source


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

这将查找限制为当前目录。— 阿库利奇
 source


可移植的是,您需要提供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,则将其放入文件中。这使您可以循环浏览可能的完成列表(以获取更多信息)。— Baldur
 source


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.';"

— 托马斯·霍拉迪
 source


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  

啊,它走了。— 埃里克·莱斯钦斯基
 source


2

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


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— 阿蒂
 source


0

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

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

通常,使用目录作为文件的前缀有助于避免解析器功能将“减号”字符错误地解释为命令选项。— 保罗·亨里克·莱利斯·戈纳尔维斯
 source


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


-3

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

cat >foo.bar <-.bar

使用命令之前:

rm -- -.bar

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