2

在 bash 中使用/home/zzz和使用时有什么区别?/home/zzz/

我刚刚发现当/home/zzz是指向另一个目录的链接时,find /home/zzz -type f什么都不会得到,但find /home/zzz/ -type f会返回该目录下的所有文件。我认为 bash 处理/home/zzz一个链接类型的文件,但/home/zzz/在这种情况下是一个目录。

还有其他区别吗?

4

2 回答 2

3

大多数 Unix 实用程序(在这种情况下)将尾部斜杠解释find为“跟随符号链接”。

POSIX 符号链接规范

When the final component of a pathname is a symbolic link, the standard requires that a trailing slash causes the link to be followed. This is the behavior of historical implementations. For example, for /a/b and /a/b/, if /a/b is a symbolic link to a directory, then /a/b refers to the symbolic link, and /a/b/ refers to the directory to which the symbolic link points.

Also see GNU Coreutils: Trailing slashes.

于 2012-11-20T09:15:52.990 回答
1

它不是 bash,它找到将符号链接视为符号链接并从自身读取属性的查找,而不是从它指向的文件中读取属性。看看find(1)怎么说,

永远不要遵循符号链接。这是默认行为。当 find 检查或打印文件信息时,该文件是符号链接,所使用的信息应取自符号链接本身的属性

要将其视为目录,您需要使用-L选项。

当 -L 选项生效时,-type 谓词将始终与符号链接指向的文件类型而不是链接本身匹配(除非符号链接被破坏)。使用 -L 会导致 -lname 和 -ilname 谓词始终返回 false。

我的猜测是,当你传递一个尾部斜杠时,/bash 会尝试解析它并 find 将其视为一个目录。如果您确定目录树中没有递归符号链接,您可以find使用-L选项调用。所以下面的命令应该可以工作。

find -L /home/zzz -type f
于 2012-11-20T09:10:34.140 回答