【问题标题】:dir path puzzle in bash?bash中的目录路径难题?
【发布时间】:2012-11-08 07:29:15
【问题描述】:

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

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

还有其他区别吗?

【问题讨论】:

    标签: linux bash path find


    【解决方案1】:

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

    来自POSIX Symbolic Link Specification

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

    另见GNU Coreutils: Trailing slashes

    【讨论】:

    • 如果/home/zzz 是一个目录而不是链接怎么办?有什么区别吗?
    【解决方案2】:

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

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

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

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

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

    find -L /home/zzz -type f
    

    【讨论】:

    • find 不是唯一的 cmd 以这种方式对待它们的,还有ls,所以我认为必须有一些共同的规则,这个共同的规则就是我想知道的。
    猜你喜欢
    • 2020-12-13
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2013-02-01
    • 2011-10-17
    • 2020-03-13
    相关资源
    最近更新 更多