jla*_*las 5 linux symlink readlink
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
-e, --canonicalize-existing
canonicalize by following every symlink in every component of the given name recursively, all components must exist
Run Code Online (Sandbox Code Playgroud)
我无法理解 -f 或 -e 是做什么的?措辞完全不清楚。规范名称基本上是最短的唯一绝对路径。但是名称的组成部分是什么意思呢?这是否意味着子目录?这里的“递归”是什么意思?我的理解是递归搜索给定规范名称的每个子目录。但是对于符号链接就没有意义了。
接下来所有组件必须存在的“-e”选项意味着什么?这里的组件是什么?
有人可以帮忙举一个简单的例子吗?谢谢
这里的第一个组件表示路径的一个元素。例子 :
/home/user/.ssh => <component1>/<component2>/<component3>
Run Code Online (Sandbox Code Playgroud)
1-假设我们有一个这样的目录结构:
lols
??? lol
??? lol1 -> lol
??? lol2 -> lol1
Run Code Online (Sandbox Code Playgroud)
而且这里不存在的目录将是 lols/lol3 所以你可以比较每个命令的输出:
readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol
Run Code Online (Sandbox Code Playgroud)
此处的输出将相同,因为路径的所有组件都存在。
readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>
Run Code Online (Sandbox Code Playgroud)
这里的输出是不同的,因为使用-f它将显示结果,因为至少在lls的路径中存在一个组件,而使用-e输出将为空,因为所有路径组件都必须存在。
最后一个是有多个不存在的目录:
readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>
Run Code Online (Sandbox Code Playgroud)
这里的输出将为空,因为如地图页面中所述: -f :除最后一个组件之外的所有组件都必须存在 => 不遵守 -o :所有组件都必须存在 => 不遵守
2- 为什么不只使用 ls -l :
假设我们创建了一个名为 file1 的文件,并创建到这个名为 link1 的文件的非符号链接,并从 link1 创建另一个符号链接 link2 :
touch file1 : file1
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1
Run Code Online (Sandbox Code Playgroud)
然后ls -l link2
输出将是:link2 -> link1 如果我们使用readlink link2
输出将是:link1; 与 ls -l 相同但如果我们使用readlink -f|-e link2
输出将是: file1 ; 所以它会指向源文件。
那么什么时候使用readlink而不是ls呢?当存在嵌套符号链接时(递归读取)。当文件/目录位于不同的位置时。
所以最好使用readlink而不是ls以避免错误。