为什么 rm 不向上递归?

为什么 rm 不向上递归?

我想知道一般的递归方向和具体的 rm 方向。

rm 递归只能向下工作,正确吗?

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

显示的当前目录ls -lha还包含...链接,因为缺少更好的词,那么为什么递归不在目录树中向上遵循这些呢? rm app 是否存在人为限制,或者...都不是真实存在的东西?

答案1

rm递归只能向下进行,正确吗?

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

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

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

显示的当前目录ls -lha还包含...链接,因为缺少更好的词,那么为什么递归不在目录树中向上遵循这些呢? rm app 是否存在人为限制,或者...都不是真实存在的东西?

这是人为的限制rm

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

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

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

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

或者...不是真实的东西?

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

答案2

除了 Michael Homer 所写的内容之外,还有另一个因素使得意外递归到父目录变得很困难。

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

echo *s*

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

echo .*s*

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

rm -fr *

不会递归到..

相关内容