在 scp 中备份原件

Vit*_*lio 2 scp shell-script

我有一个远程主机,里面有一个我想用 scp 覆盖的文件。这是一个简单的

scp 'myfile.ext' 'foo@example.com:/bar/baz'
Run Code Online (Sandbox Code Playgroud)

我还想将原始的“/bar/baz/myfile.xt”“重命名”到一个文件中,而不是用新版本覆盖它。一个简单的“/bar/baz/myfile.xt~”就足够了,但最好的是计数器或当前日期。

有没有办法用scp来做到这一点?

我想尽量减少“scp”调用,因为我需要始终输入交互式密码(不,我无法更改身份验证方法)

roa*_*ima 5

您想使用计数器或日期后缀将原始文件重命名/bar/baz/myfile.xt/bar/baz/myfile.xt~或更好。

您不能直接使用 来执行此操作scp,但这里有一些原始命令的替代方法。

  1. 使用 rsync

    rsync -ab myfile.ext foo@example.com:/bar/baz
    
    Run Code Online (Sandbox Code Playgroud)

    如果目标文件发生更改,该-b标志告诉rsync进行备份。默认是追加,~但您可以更改该默认值。例如,这将使用今天的日期(在源机器上定义):

    rsync -ab --suffix ".$(date +'%Y%m%d')" myfile.ext foo@example.com:/bar/baz
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用sshscp。我假设这baz是目标文件的名称,而不是要复制源文件的目录:

    ssh foo@example.com 'cp -p /bar/baz /bar/baz."$(date +'%Y%m%d')"' &&
    scp -p myfile.ext foo@example.com:/bar/baz
    
    Run Code Online (Sandbox Code Playgroud)

    如果您愿意,您可以使用mv代替cp,但这会丢失真正目标文件上的任何非标准权限和硬文件链接。

rsync选项更干净,但并不总是安装。