Linux rm -rf * 删除订单?

7

我之前以为rm命令会按照字母顺序删除文件,但是我的操作结果证明这并不正确。

enter image description here

那么,rm命令的执行顺序是什么呢?


4
rm -r 命令是如何进行递归删除的,它的删除顺序是什么?rm -r命令按照深度优先的方式遍历目录结构,并在回溯时删除文件和空目录。具体来说,它会首先进入子目录并继续执行相同的操作,直到到达最底层的目录。然后,它会返回到上一级目录,如果该目录为空,则删除该目录,否则不执行任何操作并继续向上回溯。这个过程一直持续到回溯到指定的目录为止。因此,在使用rm -r命令删除目录时,它会先删除该目录中的所有子目录和文件,然后再删除该目录本身。 - runDOSrun
1个回答

8

提供排序特性的不是rm本身,而是shell扩展功能。如果您键入rm *,则shell会将其扩展为类似以下内容:

rm aaa bbb ccc

rm 永远不会看到 * 参数。顺便说一下,尽管我不能确定所有 shell 都保证 sorted 行为,但对于 bash,它肯定是符合文档的:

……用匹配模式的按字母顺序排序的文件名列表替换。

命令 rm -rf * 是一个稍微奇怪的混合情况,因为即使 shell 对 * 条目进行了排序,那也只针对第一级条目。

因此,rm -rf * 可能会被展开为:

rm -rf aa_dir bb_dir cc_dir

但是对于rm内部处理目录和文件的顺序,完全取决于它的工作方式,虽然很明显,在删除目录本身之前,该目录下的所有条目都将被删除,这是一个安全的保证。

很可能只是使用readdir()或类似的东西,根据在目录“文件”中存储的方式进行排序。

无论如何,它们被删除的顺序可能并不重要 - 在权限允许的情况下,它们最终都将被删除。


谢谢!这很有帮助!我在谷歌上搜索了很多,但是很多答案都不够详细。 - michael_stackof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接