进入由链接链接的目录

Tim*_*Tim 13 shell cd-command symlink

当我cd链接时,我当前的路径以链接的路径为前缀,而不是链接链接到的目录的路径。例如

~/dirlinks/maths$ ls -l logic
lrwxrwxrwx 1 tim tim 71 Jul 27 10:24 logic -> /windows-d/academic discipline/study objects/areas/formal systems/logic

~/dirlinks/maths$ cd logic
~/dirlinks/maths/logic$ pwd
/home/tim/dirlinks/maths/logic

~/dirlinks/maths/logic$ cd ..
~/dirlinks/maths$
Run Code Online (Sandbox Code Playgroud)

我希望将当前路径更改为链接目录的路径,以便我也可以使用链接目录的父目录。除了ls找出链接目录的链接,然后cd进入它,还有哪些更简单的方法可以实现这一目标?例如,cd进入链接后,如何将当前路径更改为链接目录的路径?

cuo*_*glm 23

使用 POSIX shell,您可以使用cd内置-P选项:

cd -P <link>
Run Code Online (Sandbox Code Playgroud)

bash,来自man bash

-P 选项表示使用物理目录结构而不是跟随符号链接(另请参阅 set 内置命令的 -P 选项)

  • 你可以在原来的 `cd` 之后做这个 `cd -P .`。 (7认同)

Gil*_*il' 6

类似 Korn 的 shell 会跟踪当前目录路径中的符号链接(这称为逻辑当前目录跟踪)。如果要展开所有符号链接,请将选项传递-Pcd内置(用于物理当前目录跟踪):

cd -P logic
Run Code Online (Sandbox Code Playgroud)

如果您位于通过符号链接访问的目录中,并且想要将跟踪的当前目录切换到扩展了符号链接的路径,请运行

cd -P .
Run Code Online (Sandbox Code Playgroud)

如果要打印扩展符号链接的当前目录的路径,请运行pwd -P. 在 bash 中,如果要关闭逻辑跟踪,请运行set -P; 在 zsh 中,运行set -wsetopt chase_links.


小智 5

您可以使用readlink来确定链接指向的位置,并将此输出作为cd.

cd "$(readlink <link>)"
Run Code Online (Sandbox Code Playgroud)

在指向符号链接的附加符号链接的情况下,readlink将简单地提供目标,除非您指定它的选项之一以跟随符号链接到规范文件目标,例如readlink -f <link>.

readlink - 打印符号链接或规范文件名的值

-f, --canonicalize
通过递归跟踪给定名称的每个组件中的每个符号链接来规范化;除了最后一个组件之外的所有组件都必须存在

-e, --canonicalize-existing
通过递归遵循给定名称的每个组件中的每个符号链接来规范化,所有组件都必须存在

-m, --canonicalize-missing
通过递归跟踪给定名称的每个组件中的每个符号链接来规范化,而不要求组件存在