我有一个远程主机,里面有一个我想用 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”调用,因为我需要始终输入交互式密码(不,我无法更改身份验证方法)
您想使用计数器或日期后缀将原始文件重命名/bar/baz/myfile.xt为/bar/baz/myfile.xt~或更好。
您不能直接使用 来执行此操作scp,但这里有一些原始命令的替代方法。
使用 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)使用ssh带scp。我假设这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选项更干净,但并不总是安装。