如何获取软符号链接的原始文件的完整路径?

Eon*_*nil 123 scp symlink

我想要 scp一个文件到服务器。该文件是一个符号链接,实际上我想做的是复制源文件。

我不想手动跟踪源文件的路径,因为它可以被替换。

我如何获得源文件的绝对路径,以便我可以scp使用它?

dai*_*isy 161

试试这一行:

readlink -f `which command`
Run Code Online (Sandbox Code Playgroud)

如果command在您的$PATH变量中,否则您需要指定您知道的路径。

  • `-f` 将返回一个不存在的最终目标的路径,只要中间链接目标存在......使用 `-e` 来避免这种情况,即。如果最终目标不存在,`-e` 将返回 null。 (13认同)
  • `-f` 错误与 `readlink: 非法选项 -- f` 在 OSX 中。删除它工作正常。 (13认同)
  • @HeathBorders 对于 OSX,如果您安装了自制软件 coreutils,您也可以改用 `greadlink`。 (2认同)

Gil*_*il' 28

在 Linux 下,readlink读取符号链接的内容,并readlink -f按照符号链接到符号链接到符号链接等,直到找到不是符号链接的内容。

不过,这对于 scp 来说不是必需的:scp 始终遵循符号链接(它始终复制文件内容,忽略元数据,除非-p在可能的情况下保留文件时间和模式)。

如果您发现自己对 scp 可以保留和不能保留的元数据感到失望,我建议您使用 rsync。如果没有选项,rsync 会复制文件内容而忽略元数据。常用选项-a保留所有种类繁多的元数据(时间、符号链接、权限和所有权),还有一些选项可以保留奇特的元数据,如 ACL 和硬链接。


小智 11

我使用命令ls, stat, readlink

以文件/etc/localtime为例

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
Run Code Online (Sandbox Code Playgroud)

手术

使用统计

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
Run Code Online (Sandbox Code Playgroud)

使用阅读链接

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai
Run Code Online (Sandbox Code Playgroud)

似乎那个命令readlink -f更好。

解释

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


pol*_*ial 5

Stat 将为您提供以下信息:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...
Run Code Online (Sandbox Code Playgroud)


Ale*_*tos 5

你可以这样做

readlink -f `which command`
Run Code Online (Sandbox Code Playgroud)

或者你可以在 Linux 中得到类似的东西

stat `which command` | grep File
Run Code Online (Sandbox Code Playgroud)

如果要将其添加到脚本中,请检查错误。如果您不想在符号链接不存在的情况下看到错误消息,请使用类似

readlink -f "`which command`" 
Run Code Online (Sandbox Code Playgroud)


Xav*_*uvw 5

我会用realpath <symlink>.

根据以下用法,您所说的“源”可能是“目标”文件lnUsage: ln [OPTION]... [-T] TARGET LINK_NAME