为什么递归不随rm上升?


13

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

rm递归只能向下正确吗?

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

所显示的当前目录ls -lha还包含...链接,表示缺少一个更好的词,那么为什么递归不在目录树中沿这些向上移动呢?是否有RM应用程序的人为限制,或...不实的东西呢?


5
因为根源和疯狂,这就是谎言……
jasonwryan 2014年


1
好吧,作为一个有趣的轶事...我曾经在一些看起来很无辜的子目录上运行rm -rf,但令我震惊的是,用户在那里硬链接了一个非常重要的上游内容,然后rm继续食用。是的,我有当前备份,并且没有数据丢失,但是让它成为一个警告性的故事……:-)
Brian Knoblauch 2014年

@BrianKnoblauch,删除硬链接会带来什么危害?我听不懂你讲的故事...
Alexey,

@Alexey关键是没有删除硬链接本身。它递归到硬链接目录,该目录链接到文件系统中的更高点,因此开始吃掉每个人的数据……
Brian Knoblauch

Answers:


18

rm 递归只能向下正确吗?

rm -r x y将删除xy以及其中的所有内容(如果它们是目录),但不会删除其父母或外部的任何内容。

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

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

所显示的当前目录ls -lha还包含...链接,表示缺少一个更好的词,那么为什么递归不在目录树中沿这些向上移动呢?是否有RM应用程序的人为限制,或...不实的东西呢?

这是人为限制rm

不过,这实际上并不是所有的人为操作-这是它可能起作用的唯一方法。如果rm遵循父..链接,则每个人都rm -r将通过跟踪所有..链接一直回到来删除系统上的每个文件/。当列出目录内容时,它会在每个目录中rm看到...条目,并因此而明确地忽略它们。

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

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

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

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

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


对于任何寻求证明的人(或只是有兴趣的人),请看一下如何在GNU coreutils中实现这一点
克里斯·海斯

@ChrisHayes答案中有等效的gitweb链接。实际的递归情况是在fts_read实现中,不过,这种情况仅适用于命令行参数。
2014年

@MichaelHomer哇,是这样。该链接颜色在此SE方案上并不突出。我的错。
克里斯·海斯

2
这个答案是正确的,但也有些不准确。rm甚至看不到,*.QTFS因为它在调用rm二进制文件之前被bash扩展为文件名。@tobyink的答案指出了这一点。
2014年

附带说明一下,据说这些行为...特殊情况的行为是dotfile存在的原因
mgarciaisaia 2014年

5

除了Michael Homer撰写的内容之外,还有另一个因素使得很难意外地将其递归到父目录中。

进入您的主目录,然后输入以下内容:

echo *s*

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

echo .*s*

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

rm -fr *

不会递归..

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.