为什么递归不随 rm 向上?

13 recursive

我想知道一般递归的方向,特别是 rm 。

rm 递归只能向下正确吗?

运行: sudo rm -R *.QTFS将删除当前目录及其子目录中的所有 *.QTFS 文件,对吗?

由于缺少更好的词,显示的当前目录ls -lha也包含...链接,那么为什么递归不在目录树中向上跟踪?是否有RM应用程序的人为限制,或...不实的东西呢?

Mic*_*mer 18

rm 递归只能向下正确吗?

rm -r x y将删除xandy和其中的所有内容(如果它们是目录),但不会删除它们的父级或它们之外的任何内容。

运行:sudo rm -R *.QTFS将删除当前目录及其子目录中的所有 *.QTFS 文件,对吗?

不,它会删除所有名为*.QTFS,递归的任何文件中的目录*.QTFS,和这些目录本身。如果您想要其他删除行为,请使用find -delete.

由于缺少更好的词,显示的当前目录ls -lha也包含...链接,那么为什么递归不在目录树中向上跟踪?是否有RM应用程序的人为限制,或...不实的东西呢?

这是 的人为限制rm

然而,这并不是那么人为的——这是它唯一可行的方法。如果rm跟随父..链接,每个都rm -r将删除系统上的每个文件,通过跟随所有..链接一直回到/. 在列出内容时会rm看到每个目录中的...条目,并因此明确忽略它们。

事实上,你可以自己尝试一下。运行rm -r .,大多数rm实现会拒绝行动,明确报告错误:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
Run Code Online (Sandbox Code Playgroud)

(该消息来自 GNUrm;其他消息类似)。当它隐式地遇到这些条目时,而不是作为显式参数,它只是忽略它们并继续。这种行为是POSIX要求的。在 GNUrm和许多 BSD 中,它是由fts_read层次遍历函数系列自动提供的。

或者...不实的东西呢?

.并且..一般真正的目录条目,尽管这是特定的文件系统。无论如何,它们几乎总是被呈现为好像它们是所有用户代码的真实条目。许多软件(不仅仅是rm)对它们的行为进行特殊处理,以捕获或防止失控或不受欢迎的递归。

  • 这个答案是正确的,但也有点不精确。`rm` 甚至看不到 `*.QTFS`,因为它在调用 rm 二进制文件之前被 bash 全局扩展为文件名。@tobyink 的回答指出了这一点。 (2认同)

小智 5

除了迈克尔·霍默 (Michael Homer) 所写的内容之外,还有另一个因素使意外递归到父目录变得困难。

进入您的主目录并键入以下内容:

echo *s*
Run Code Online (Sandbox Code Playgroud)

您会看到它显示了包含字母“s”的文件和目录列表。但是,不会显示以前导点开头的文件。要显示它们,您可以使用:

echo .*s*
Run Code Online (Sandbox Code Playgroud)

这是因为外壳拒绝扩展*以包含前导点。这意味着:

rm -fr *
Run Code Online (Sandbox Code Playgroud)

不会递归到...