如何让 scp 复制文件而不是其符号链接

如何让 scp 复制文件而不是其符号链接

我想要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参数说明

man readlink:

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

答案4

你可以做

readlink -f `which command`

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

stat `which command` | grep File

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

readlink -f "`which command`" 

相关内容