简短的回答

简短的回答

我正在尝试删除名为 的目录--crm。当我做

rm -f -R '--crm'

我收到以下错误:

rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
   unlink file

我也尝试过

rm -f -R *crm

但该目录没有被删除。

有什么线索我该怎么做吗?

答案1

老实说,这可能更适合其他 .SE 之一,无论是 Unix &Linux、Ask Different,还是 SuperUser。这就是为什么我认为你被否决了。那是说...

简短的回答

答案是rm -r ./--crm,或者更好的是,rmdir ./--crm


真正的答案

在 OS X 上,您通常在终端中使用 Bash,了解这一点很重要:您使用的 shell 有助于确定可让您操作文件和目录的基本语句的语法,其中包括重命名、删除或调用内核处决他们。

与 一起man rm,花几天时间阅读man bash并学习其中的一些概念。

除此之外,大多数 Unix 命令行程序都使用命令后面的特定参数来运行。有些是显而易见的,通过将数据传递给程序来工作。例如,通过运行rm myfile,您可以调用内核对文件 运行取消链接程序myfile。其他参数的作用就像一组开关,用于打开或关闭某些选项。这些有时称为“标志”,而不是传递数据来控制程序本身的行为。例如,rm -h不会删除任何内容,而是打印一小段有用的文本。

因此,删除具有不寻常名称的文件的问题是程序不知道如何解释它。向它扔字符也没有帮助,而且可能会给你带来麻烦。

使用 Bash:为什么它不起作用

Bash(您的 shell)通过剥离引号并按原样获取内容,按字面解释单引号中的任何内容。因此,通过运行rm '--crm',您实际上正在运行与 相同的事情rm --crm。 Bash 专门将其*视为特殊字符,执行我们称为“通配符”的操作:在运行您调用的程序之前,Bash 将将参数扩展到您指定的每个匹配路径名。实际上,如果您的目录中有

~$ ls
--crm   dummy.txt       file.crm

然后运行rm *crm​​,Bash 将首先扩展它,然后运行扩展版本:

~$ rm --crm file.crm

...因此您面临着销毁所有以“crm”结尾的文件的风险,而且它只是再次将第一个目录解释为标志。

使用 Bash:什么有效

为了将您的目录视为要删除的文件,Bash 需要知道的,以及它需要知道的一切,rm始终需要:一个显式的、完全限定的路径名​​。对于像上面这样的大多数普通文件myfile,Bash 足够聪明,知道您通常指的是当前工作目录——您可以使用cd.有两个特殊角色致力于帮助管理这个问题。cd ..例如,将带您进入当前目录“上方”的目录。如果您在 /Users/foobar 中,并且运行cd ..,您将移动到 /Users。同样,还有一个表示当前目录的字符,即.。运行cd .将带您...到您已经所在的目录。看起来没什么用,不是吗?

但这为我们提供了一种方法来告诉 Bash 不幸命名的目录所在的位置:当前目录中存在.file --crm,因此您可以指定它,并删除它,使用rm ./--crm— 嗯,特别是这是一个目录,所以您有告诉rm下降递归浏览目录,并首先删除在那里找到的所有内容。您可以使用-r标志来执行此操作:因此,rm -r ./--crm.

最后警告:既然我已经尝试解释这一切,我希望您也了解跑步的严重危险rm -r -f /-f除非您知道自己在做什么,否则永远不应该使用该标志。

相关内容