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

Bry*_*ein 428 command-line shell options quoting rm

如何删除文件名以破折号(连字符或减号)开头的文件-?我通过 ssh 连接到远程 OSX 服务器,并且我的目录中有这个文件:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...
Run Code Online (Sandbox Code Playgroud)

我怎么--help能从 CLI 中删除?这个问题是我偶尔以不同形式遇到的问题,这些文件很容易创建,但很难摆脱。

我试过使用反斜杠

rm \-\-help
Run Code Online (Sandbox Code Playgroud)

我试过引号

rm "--help"
Run Code Online (Sandbox Code Playgroud)

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

小智 640

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

rm -- --help
Run Code Online (Sandbox Code Playgroud)

  • @dtech、getopt() 和 `--` 早于 GNU(SysIII,1980)并且是标准/POSIX。除了少数例外(如`echo`)的标准实用程序理解`--`。YMMV 用于其他命令,如果它们不使用 getopt() API 来解析选项。 (8认同)
  • @KeithThompson -- 是大多数 GNU 工具的一个特性,因此它不适用于大多数非 GNU(“非 Linux”)Unix 系统(例如 BSD 变体或某些嵌入式系统) (3认同)
  • `rm` 命令的所有版本都支持 `--` 参数吗? (2认同)

小智 260

或者你可以做

rm ./--help
Run Code Online (Sandbox Code Playgroud)

  • 即使对于不特别对待 `--` 的命令,这种方法也总是有效。 (31认同)
  • 这是我记得的一个。使用 "rm -- --help" 是我总是必须查找的东西。 (3认同)

acu*_*ich 43

find它来做:

find . -name '--help' -delete
Run Code Online (Sandbox Code Playgroud)

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

事实上,你避免rm赞成find(尤其是先预览)是一个好习惯,它可以帮助你避免错误,rm *因为它会不可避免地在某一天咬你。

但是请注意,该 find 将遍历您的所有子目录,因此您可能希望使用子目录深度约束来运行它,如下所示:

find . -maxdepth 1 -name '--help' -delete
Run Code Online (Sandbox Code Playgroud)

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


Bal*_*dur 21

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

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

find . -inode <inode> -exec rm {}\;
Run Code Online (Sandbox Code Playgroud)

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

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards
Run Code Online (Sandbox Code Playgroud)

.inputrc如果您使用 bash,请进入您的文件。这允许您循环浏览可能完成的列表(以获取更多信息)。

  • 这种方式有两个问题:1)可以使用-delete时不要使用-exec rm;2) 获取 inode 并使用它会不必要地过于复杂,只要您可以使用:`find -name '--help' -delete` (6认同)
  • 此命令的另一个问题是,`{}` 和 `\;` 之间必须有一个空格,否则将不起作用。 (2认同)

小智 11

一个残酷的解决方案:

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

perl -e "rmdir '-d' or die 'Could not rmdir.';"
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 8

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

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

如果您尝试删除的文件包含星号或斜杠,请不要意外使用./**其他通配符,这可能会级联删除您的操作系统。

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

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo
Run Code Online (Sandbox Code Playgroud)

首先,使用 find 找到它:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo
Run Code Online (Sandbox Code Playgroud)

确保 find 命令只找到您要删除的 ONE 文件:

然后通过 -delete 选项查找,删除它们:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  
Run Code Online (Sandbox Code Playgroud)

Aaaand它不见了。