我有一个远程主机,其中有一个我想用 scp 覆盖的文件。这是一个简单的
scp 'myfile.ext' '[email protected]:/bar/baz'
我还想将原始的“/bar/baz/myfile.xt”“重命名”到一个文件中,而不是用新版本覆盖它。一个简单的“/bar/baz/myfile.xt~”就足够了,但最好是一个计数器或当前日期。
有什么方法可以用 scp 做到这一点吗?
我想尽量减少“scp”调用,因为我需要始终输入交互式密码(不,我无法更改身份验证方法)
答案1
您想将原始名称重命名/bar/baz/myfile.xt
为/bar/baz/myfile.xt~
或更好,并带有计数器或日期后缀。
您不能直接使用 执行此操作scp
,但这里有一些原始命令的替代方法。
使用
rsync
rsync -ab myfile.ext [email protected]:/bar/baz
该
-b
标志指示rsync
如果目标文件发生更改则进行备份。默认是追加~
,但您可以更改该默认值。例如,这将使用今天的日期(如源计算机上定义的):rsync -ab --suffix ".$(date +'%Y%m%d')" myfile.ext [email protected]:/bar/baz
ssh
与 一起使用scp
。我假设这baz
是目标文件的名称,而不是要复制源文件的目录:ssh [email protected] 'cp -p /bar/baz /bar/baz."$(date +'%Y%m%d')"' && scp -p myfile.ext [email protected]:/bar/baz
如果您愿意,可以使用
mv
而不是cp
,但这会丢失真正目标文件上的任何非标准权限和硬文件链接。
该rsync
选项更干净,但并不总是安装。
答案2
一定是这样吗scp
?我不认为它可以为您重命名文件(除了远程复制之外,但我从来不确定它的效果如何。)
sftp
会让事情变得相当简单
$ echo -e 'rename test test.old\nput test' | sftp user@hostname
您也可以使用 来完成此操作,但请注意,这不会复制任何内容,而是复制(无权限、时间戳...)ssh
的数据。test
$ cat test | ssh user@hostname 'mv test "test.$(date +%F_%T)"; cat > test'
答案3
您可以使用mirrordir
Mirror ~/scripts to ~/scripts.backup:
$ mkdir ~/scripts.backup
$ mirrordir -v ~/scripts ~/scripts.backup
If you rerun mirrordir again, only the updated files are copied.
You can mirroring FTP sites:
$ mirrordir -v ftp://ftp.nixcraft.in/pub /home/backup/nixcraft.in/ftp/pub
mirrordir offers tons of option, refer mirrordir man page for more examples and options:
$ man mirrordir