我发现 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
另一方面,SunOS
and已经在 1985 年BSD
有了 a ,并且由于/没有在 之上实现,它可以使用不同的语义,而且确实如此。on在打印出不同的挂载点后停止下降。-xdev
SunOS
BSD
find
*ftw()
find -xdev
SunOS
st_dev
然后在 1992 年,第一个POSIX
标准不仅包含了仅提及libc
的文件格式(如 tar)。该 POSIX 标准的问题在于必须报告挂载点并在报告挂载点后停止,而 实现在报告挂载点之前停止。find
-xdev
-xdev
AT&T
GNU find 是遵循 POSIX.1-1992 文本的实现。
因此,我们最近在 POSIX 标准电话会议上讨论了相关错误报告,并决定使用主要的标准-mount
和.FTW_XDEV
nftw()
find -mount
其行为方式必须与find
AT&T UNIX 上的行为方式相同,并且不得报告安装点。
find -xdev
必须按照 POSIX 标准编写的方式运行,并且需要报告挂载点并在树下降时停止。
这需要AT&T
基于 UNIX 的find
实现来更改其实现-xdev
并让 GNU 发现更改 的行为-mount
。
顺便说一句:据我所知,sfind/libfind
这是目前唯一已经遵循新规则的实现。
由于libfidnd
在 POSIX 最终协议建立之前就已经实现了所需的代码,因此它实现了一个-mount+
primary,-xdev
现在已经成为一个别名,-mount+
更容易记住在挂载点处停止,但另外还报告它们。