在bash中的dir路径拼图?

时间:2012-11-20 09:02:46

标签: linux bash path find

在bash中使用/home/zzz/home/zzz/之间的区别是什么?

我刚发现当/home/zzz是指向另一个目录的链接时,find /home/zzz -type f将无法获得任何内容,但find /home/zzz/ -type f将返回该目录下的所有文件。我认为bash会将/home/zzz视为链接类型文件,但在这种情况下/home/zzz/为dir。

还有其他差异吗?

2 个答案:

答案 0 :(得分:3)

大多数Unix实用程序(在本例中为find)解释尾部斜杠表示“遵循符号链接”。

来自POSIX Symbolic Link Specification

  

当路径名的最后一个组件是符号链接时,   标准要求尾部斜杠导致链接   紧随其后。这是历史实现的行为。对于   例如,对于 / a / b / a / b / ,如果 / a / b 是指向a的符号链接   目录,然后 / a / b 是指符号链接, / a / b / 是指   符号链接指向的目录。

另见GNU Coreutils: Trailing slashes

答案 1 :(得分:1)

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

  

切勿关注符号链接。 这是默认行为。当find查看或打印文件信息,并且文件是符号链接时,所使用的信息应取自符号链接本身的属性

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

  

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

我的猜测是当你传递一个尾部斜杠/ bash试图解析它并找到它看作一个目录。如果您确定目录树中没有递归符号链接,则可以使用find选项调用-L。所以跟随命令应该有效。

find -L /home/zzz -type f