find 中 xdev 选项名称背后的历史是什么?

find 中 xdev 选项名称背后的历史是什么?

我发现 xdev 选项的名称违反直觉。对我来说,这似乎是“跨设备(搜索)”的缩写。但它的作用恰恰相反,它将搜索限制为单个文件系统。另一种但有些过时的名称是“mount”,它更容易记住。该选项命名背后的历史是什么?

答案1

它很可能确实代表跨设备,尽管实际上它意味着不是跨设备

在里面1985 年在 BSD 上最初的实现,代码有:

int    Xdev = 1;       /* true if SHOULD cross devices (file systems) */
[...]
   else if (EQ(a, "-xdev")) {
           Xdev = 0;

Xdev用于跟踪设备是否应该交叉的内部变量在哪里。谓词-xdev将其设置为 0。

几年后,AT&T 的 David Korn 为 SVR4 添加了一个类似的谓词,并-mount为其起了一个别名(反映了FTW_MOUNT新的树行走库的标志)。

我不认为这个-mount选项特别好。假设它代表单安装,这在 Linux 上也是有误导性的,至少在 Linux 上你可以为一个文件系统设置多个挂载点。

$ mkdir -p a/b b
$ sudo mount --bind a b

现在b是同一个挂载点设备作为.a.

$ find . -xdev
.
./b
./b/b
./a
./a/b
$ find . -mount
.
./b
./b/b
./a
./a/b

find处理时不会跨设备b,但它是不同的点所以-mount(作为单安装)更具误导性-xdev(只要你记得它是关于预防交叉设备)。

答案2

它比您可能相信的还要复杂。

在 AT&T 的 实现中find,该功能已nftw()被引入SVr4并且nftw()确实带有一个标志,FTW_MOUNT该标志在安装点处停止并且不报告具有不同条目的文件st_dev

该命令在 1988 年SVr4 find确实同时具有-mount和,并且是.-xdev-xdev-mount

另一方面,SunOSand已经在 1985 年BSD有了 a ,并且由于/没有在 之上实现,它可以使用不同的语义,而且确实如此。on在打印出不同的挂载点后停止下降。-xdevSunOSBSD find*ftw()find -xdevSunOSst_dev

然后在 1992 年,第一个POSIX标准不仅包含了仅提及libc的文件格式(如 tar)。该 POSIX 标准的问题在于必须报告挂载点并在报告挂载点后停止,而 实现在报告挂载点之前停止。find-xdev-xdevAT&T

GNU find 是遵循 POSIX.1-1992 文本的实现。

因此,我们最近在 POSIX 标准电话会议上讨论了相关错误报告,并决定使用主要的标准-mount和.FTW_XDEVnftw()

find -mount其行为方式必须与findAT&T UNIX 上的行为方式相同,并且不得报告安装点。

find -xdev必须按照 POSIX 标准编写的方式运行,并且需要报告挂载点并在树下降时停止。

这需要AT&T基于 UNIX 的find实现来更改其实现-xdev并让 GNU 发现更改 的行为-mount

顺便说一句:据我所知,sfind/libfind这是目前唯一已经遵循新规则的实现。

由于libfidnd在 POSIX 最终协议建立之前就已经实现了所需的代码,因此它实现了一个-mount+primary,-xdev现在已经成为一个别名,-mount+更容易记住在挂载点处停止,但另外还报告它们。

相关内容