13 recursive
我想知道一般递归的方向,特别是 rm 。
rm 递归只能向下正确吗?
运行: sudo rm -R *.QTFS
将删除当前目录及其子目录中的所有 *.QTFS 文件,对吗?
由于缺少更好的词,显示的当前目录ls -lha
也包含.
和..
链接,那么为什么递归不在目录树中向上跟踪?是否有RM应用程序的人为限制,或.
与..
不实的东西呢?
Mic*_*mer 18
rm
递归只能向下正确吗?
rm -r x y
将删除x
andy
和其中的所有内容(如果它们是目录),但不会删除它们的父级或它们之外的任何内容。
运行:
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
)对它们的行为进行特殊处理,以捕获或防止失控或不受欢迎的递归。
小智 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)
不会递归到..
.