我想要scp
一个文件到服务器。该文件是一个符号链接,实际上我想做的是复制源文件。
我不想手动跟踪源文件的路径,因为它可以被替换。
如何获取源文件的绝对路径以便我可以scp
使用它?
答案1
试试这一行:
readlink -f `which command`
如果command
在您的$PATH
变量中,否则您需要指定您知道的路径。
答案2
在 Linux 下,readlink
读取符号链接的内容,并readlink -f
跟踪符号链接到符号链接到符号链接,等等,直到找到不是符号链接的内容。
但这对于 scp 来说不是必需的:scp 始终遵循符号链接(它始终复制文件内容,忽略元数据,但-p
尽可能保留文件时间和模式)。
如果您发现自己对元数据 scp 能够和不能保留的内容感到失望,我建议使用 rsync。如果没有选项,rsync 会复制文件内容而忽略元数据。常用的选项-a
会保留所有普通元数据(时间、符号链接、权限和所有权),并且还有一些选项可以保留 ACL 和硬链接等外来元数据。
答案3
ls
对比命令、stat
、的使用readlink
,以对文件的操作/etc/localtime
为例:
- 使用LS:
[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
- 使用统计数据
[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’
- 使用阅读链接
[flying@lempstacker ~]$ readlink /etc/localtime ../usr/share/zoneinfo/Asia/Shanghai [flying@lempstacker ~]$ readlink -f /etc/localtime /usr/share/zoneinfo/Asia/Shanghai
看起来这个命令readlink -f
是最合适的。
-f参数说明
-f
,--canonicalize
:通过递归地跟踪给定名称的每个组件中的每个符号链接来规范化;除最后一个组件外的所有组件都必须存在
答案4
你可以做
readlink -f `which command`
或者你可以在 Linux 中得到类似的东西
stat `which command` | grep File
如果您要将其添加到脚本中,请检查错误。如果您不想在符号链接不存在的情况下看到错误消息,请使用类似的内容
readlink -f "`which command`"