我想知道一般的递归方向,特别是rm。
rm递归只能向下正确吗?
运行: sudo rm -R *.QTFS
将删除当前目录及其子目录中的所有* .QTFS文件,对吗?
所显示的当前目录ls -lha
还包含.
和..
链接,表示缺少一个更好的词,那么为什么递归不在目录树中沿这些向上移动呢?是否有RM应用程序的人为限制,或.
与..
不实的东西呢?
我想知道一般的递归方向,特别是rm。
rm递归只能向下正确吗?
运行: sudo rm -R *.QTFS
将删除当前目录及其子目录中的所有* .QTFS文件,对吗?
所显示的当前目录ls -lha
还包含.
和..
链接,表示缺少一个更好的词,那么为什么递归不在目录树中沿这些向上移动呢?是否有RM应用程序的人为限制,或.
与..
不实的东西呢?
Answers:
rm
递归只能向下正确吗?
rm -r x y
将删除x
,y
以及其中的所有内容(如果它们是目录),但不会删除其父母或外部的任何内容。
运行:
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 ‘.’
(该消息来自GNUrm
;其他消息类似)。当它隐式地遇到这些条目时,而不是作为显式参数时,它将忽略它们并继续。POSIX需要该行为。在GNU rm
和许多BSD中,它是由fts_read
层次结构遍历函数系列自动提供的。
或者
.
和..
不实的东西呢?
.
并且..
是一般真正的目录条目,尽管这是特定的文件系统。无论如何,它们几乎总是被呈现为好像它们是所有用户代码的真实条目。许多软件(不仅是软件rm
)都会对其行为进行特殊说明,以捕获或防止失控或不希望的递归。
fts_read
实现中,不过,这种情况仅适用于命令行参数。
rm
甚至看不到,*.QTFS
因为它在调用rm二进制文件之前被bash扩展为文件名。@tobyink的答案指出了这一点。