如何删除文件名以破折号(连字符或减号)开头的文件-
?我被放入远程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)
sourcehttps://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:
使用“-”使rm停止解析命令行选项,如下所示:
rm -- --help
1
我知道这很简单……— Bryan Rehbein 2010年
2rm
命令的所有版本都支持该--
参数吗?— 基思·汤普森
3
@KeithThompson-是大多数GNU工具的功能,因此它不适用于大多数非GNU(“非Linux”)Unix(例如BSD变体或某些嵌入式系统)— dtech
1
谢谢!那挽救了我的一天。当然,它可以在BSD(OSX)和其他命令上运行!— raskhadafi
8
@ dtech,getopt()和--
GNU(SysIII,1980)之前是标准/ POSIX。除了一些例外情况(如echo
),标准实用程序都可以理解--
。如果其他命令未使用getopt()API来解析选项,则为YMMV。— 斯特凡Chazelas
或者你可以做
rm ./--help
7
没关系,但这似乎是最“正确”的。— James M.
2
这是我记得的那个。我总是必须使用“ rm—help”。— user603 2010年
25
即使对于不--
特别对待的命令,此方法也始终有效。— jw013 2011年
而且它也可以以避免对其他类型的一些特殊对待(选项旁)特别命名的参数,如-
文本或实用工具cd
的foo=bar
的awk
…— 斯特凡Chazelas
1
当文件以单破折号开头(而不是破折号)时,此方法有效rm -- <filename>
。— StockB
使用find
它来做:
find . -name '--help' -delete
这是一个很好的方法,因为如果您有多个这样的文件可以删除,则可以通过简单地先运行find而无需-delete
选择该选项来获得文件的预览列表,然后如果文件列表看起来不错就可以运行再次与-delete
。
实际上,避免rm
使用find
(尤其是先预览)是一个好习惯,它将帮助您避免犯错,rm *
这不可避免地会折磨您一天。
但是请注意,该查找将在所有子目录中递归,因此您可能需要使用子目录深度约束来运行它,如下所示:
find . -maxdepth 1 -name '--help' -delete
可移植的是,您需要提供find
要查看的文件/目录的列表。所以find . -name...
。-delete
而-maxdepth
不是标准的选择无论是。— 斯特凡Chazelas
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 ./--help
和rm ./sub/dirs/--help
。要解决第二个问题,必须添加-maxdepth 1
,但是所有这些实质上都是以一种更加绕行,复杂的方式应用@edfuh的解决方案,并且-delete
比以往任何时候都更安全-exec rm
。— jw013 2011年
1
此命令的另一个问题是{}
和之间必须有一个空格\;
,否则它将不起作用。— Eugene S
索引节点可能是唯一的,但可能有多个具有相同索引节点的目录条目。这些称为硬链接。而且它们在每个文件系统中都是唯一的,因此您需要使用-xdev
。那帮不了你ls -i --help
。— 斯特凡Chazelas
一个残酷的解决方案:
perl -e "unlink '--help' or die 'Could not unlink.';"
perl -e "rmdir '-d' or die 'Could not rmdir.';"
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
午夜指挥官(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年
这是我在找到此线程之前使用的解决方案。
用于vim
“编辑”目录:
vim .
然后(在vim中)选择您的文件,点击del并确认删除。
完成后,退出vim:q
— 阿蒂
source
您是否尝试将目录名称添加为前缀:
$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste
通常,使用目录作为文件的前缀有助于避免解析器功能将“减号”字符错误地解释为命令选项。— 保罗·亨里克·莱利斯·戈纳尔维斯
source
1
我相信先前的答案已经涵盖了这一点。— Kusalananda
如果要重命名文件(-.bar
,mv将不起作用),请尝试以下操作:
cat >foo.bar <-.bar
使用命令之前:
rm -- -.bar
您应该能够在foo.bar中检查原始文件的内容