在 bash 中使用/home/zzz
和使用时有什么区别?/home/zzz/
我刚刚发现当/home/zzz
是指向另一个目录的链接时,find /home/zzz -type f
什么都不会得到,但find /home/zzz/ -type f
会返回该目录下的所有文件。我认为 bash 处理/home/zzz
一个链接类型的文件,但/home/zzz/
在这种情况下是一个目录。
还有其他区别吗?
大多数 Unix 实用程序(在这种情况下)将尾部斜杠解释find
为“跟随符号链接”。
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.
它不是 bash,它找到将符号链接视为符号链接并从自身读取属性的查找,而不是从它指向的文件中读取属性。看看find(1)怎么说,
永远不要遵循符号链接。这是默认行为。当 find 检查或打印文件信息时,该文件是符号链接,所使用的信息应取自符号链接本身的属性。
要将其视为目录,您需要使用-L
选项。
当 -L 选项生效时,-type 谓词将始终与符号链接指向的文件类型而不是链接本身匹配(除非符号链接被破坏)。使用 -L 会导致 -lname 和 -ilname 谓词始终返回 false。
我的猜测是,当你传递一个尾部斜杠时,/
bash 会尝试解析它并 find 将其视为一个目录。如果您确定目录树中没有递归符号链接,您可以find
使用-L
选项调用。所以下面的命令应该可以工作。
find -L /home/zzz -type f