繁体   English   中英

POSIX ls -R是否规定了特定的遍历顺序? 如果没有,那么哪个假设更可能是可移植的:深度优先还是广度优先?

[英]Does POSIX ls -R dictate a specific traversal order? If not, then which assumption is more likely to be portable: depth-first or breadth-first?

我正在研究一个存储与文件系统的inode树非常相似的系统。 它已经具有ls命令的等价物,但它还不支持递归选项。 我正在研究添加递归选项的实现选择。 我想最大限度地了解知道POSIX ls用户,并最大限度地提高任何编写的脚本的可移植性,以便使用POSIX ls -R的输出。

似乎ls -R可以通过深度优先遍历或广度优先遍历来实现。 但是,我无法找到关于特定遍历顺序是否由规范决定或者是否作为实现选择留下的确定答案。

lsPOSIX文档中 ,我找不到任何具体的答案。 这是我能找到的与递归实现相关的唯一语句:

在处理-R选项时,期望实现遍历任意深度。 对深度的唯一限制应该是基于耗尽物理存储来跟踪未遍历的目录。

我也尝试过查看nftw的文档。 我再次发现没有关于那里的遍历顺序的具体陈述。

对于一些经验测量,我在CentOS盒子上进行了测试,其中的行为显然是深度优先遍历。

> uname -a
Linux centos 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

> yum info coreutils
Loaded plugins: fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Loading mirror speeds from cached hostfile
 * base: mirror.pac-12.org
 * elrepo: ftp.osuosl.org
 * epel: linux.mirrors.es.net
 * extras: repos.lax.quadranet.com
 * updates: ftp.osuosl.org
Installed Packages
Name        : coreutils
Arch        : x86_64
Version     : 8.22
Release     : 11.el7
Size        : 14 M
Repo        : installed
From repo   : anaconda
Summary     : A set of basic GNU tools commonly used in shell scripts
URL         : http://www.gnu.org/software/coreutils/
License     : GPLv3+
Description : These are the GNU core utilities.  This package is the combination of
            : the old GNU fileutils, sh-utils, and textutils packages.

> tree testTraversal/
testTraversal/
├── dir1
│   └── dir8
│       └── dir9
│           └── dir10
├── dir2
│   ├── dir4
│   │   └── dir5
│   ├── dir6
│   ├── file1
│   └── file2
├── dir3
└── dir4
    └── dir5
        └── dir6
            └── dir7
                ├── file3
                ├── file4
                └── file5

> ls -R testTraversal/
testTraversal/:
dir1/  dir2/  dir3/  dir4/

testTraversal/dir1:
dir8/

testTraversal/dir1/dir8:
dir9/

testTraversal/dir1/dir8/dir9:
dir10/

testTraversal/dir1/dir8/dir9/dir10:

testTraversal/dir2:
dir4/  dir6/  file1  file2

testTraversal/dir2/dir4:
dir5/

testTraversal/dir2/dir4/dir5:

testTraversal/dir2/dir6:

testTraversal/dir3:

testTraversal/dir4:
dir5/

testTraversal/dir4/dir5:
dir6/

testTraversal/dir4/dir5/dir6:
dir7/

testTraversal/dir4/dir5/dir6/dir7:
file3  file4  file5

我不知道这是由规范决定的行为还是只是GNU coreutils的实现细节。

我自己的观察是文件系统中的目录结构往往比它们更深。 这表明深度优先通常是更具内存效率的实现选择,尽管有可能提出反面例子,其中广度优先将更具内存效率。

遍历顺序是否符合规范中的任何位置? 如果不是,那么深度优先遍历是否广泛用于实现,因此比广度优先更安全?

coreutils确实是深度优先的。 busybox是深度第一。 BSD / OS X是深度优先的(实验性的;源是不可读的)。 我希望大多数实现都是深度优先的,因为它很容易递归,并且因为路径长度的POSIX限制非常紧密地限制了深度优先遍历的内存/堆栈使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM