我想知道一般的递归方向和具体的 rm 方向。
rm 递归只能向下工作,正确吗?
运行: sudo rm -R *.QTFS
将删除当前目录及其子目录中的所有 *.QTFS 文件,对吗?
显示的当前目录ls -lha
还包含.
和..
链接,因为缺少更好的词,那么为什么递归不在目录树中向上遵循这些呢? rm app 是否存在人为限制,或者.
和..
都不是真实存在的东西?
答案1
rm
递归只能向下进行,正确吗?
rm -r x y
将删除x
andy
和 其中的所有内容(如果它们是目录),但不会删除它们的父级或它们之外的任何内容。
运行:
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 *
不会递归到..
。