我想将scp
文件发送到服务器。该文件是一个符号链接,实际上我要复制源文件。无论如何,我不想手动跟踪源文件的路径,因为可以替换它。如果可以获取源文件的绝对路径,则可以sep
使用它。我怎么走?
scp -r
强制遵循符号链接。
我想将scp
文件发送到服务器。该文件是一个符号链接,实际上我要复制源文件。无论如何,我不想手动跟踪源文件的路径,因为可以替换它。如果可以获取源文件的绝对路径,则可以sep
使用它。我怎么走?
scp -r
强制遵循符号链接。
Answers:
试试这一行:
readlink -f `which command`
如果command
在您的$PATH
变量中,否则您需要指定您知道的路径。
-f
只要中间链接目标存在,它将返回一个不存在的最终目标的路径-e
。-e
如果最终目标不存在,则将返回null。
-f
readlink: illegal option -- f
在OSX中出现错误。删除它工作正常。
greadlink
。
在Linux下,readlink
读取符号链接的内容,并readlink -f
跟随符号链接到符号链接到符号链接等,直到找到不是符号链接的内容。
但是,这对于scp而言不是必需的:scp始终遵循符号链接(它始终复制文件内容,忽略元数据,但-p
在可能的情况下会保留文件时间和模式)。
如果您对元数据scp可以保留和不能保留的内容感到失望,建议您使用rsync。如果没有选择,rsync将忽略元数据复制文件内容。常用的选项-a
保留所有花园类型的元数据(时间,符号链接,权限和所有权),还有一些选项可保留异类元数据,例如ACL和硬链接。
我使用的命令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
使用统计
[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’
使用readlink
[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai
似乎该命令readlink -f
更好。
-f,--canonicalize:通过递归跟随给定名称的每个组件中的每个符号链接来规范化;除了最后一个组件之外的所有组件都必须存在-从
man readlink
我会用realpath <symlink>
。
根据以下用途,您所谓的“源”可能是“目标”文件ln
:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
readlink
没有剪掉...愚蠢的mac。大声笑
readlink -f 'which java'
没有为我工作。
但是这样做:
readlink -f $(which java)
`
不是'
..但$()
还是更好的做法。
$()
更好的做法,我将愿意投票。
command
,但已弃用。使用$()更好,因为封装$($(command))更容易,并且不需要特殊的转义。然后是首选。在您的第一个示例中,您使用了通常的撇号,然后readlink尝试查找名称为'哪个java'且名称中带有空格的文件。但是您打算使用带有参数java的call命令,以查找java二进制可执行路径。
scp
版本默认都遵循符号链接,不是吗?您应该检查一下,也许可以节省一些工作。