使用 Scp 时防止覆盖文件 [关闭]

Posted

技术标签:

【中文标题】使用 Scp 时防止覆盖文件 [关闭]【英文标题】:Prevent overwriting of files when using Scp [closed] 【发布时间】:2012-11-04 20:20:57 【问题描述】:

我正在使用 scp 复制一些文件,我不想覆盖已经存在的文件。

如果我使用 cp 命令,我认为这可以使用 cp -n 来完成。

scp是否有类似的选项,我浏览了SCP的文档,似乎没有这样的选项。

rsync 或 sftp 是解决这个问题的方法吗?

添加信息:

操作系统:Ubuntu 12.04

【问题讨论】:

【参考方案1】:

我没有测试它,但也许首先通过sshfs 安装,然后使用cp 就可以了。

【讨论】:

【参考方案2】:

rsync 似乎可以解决您的问题。这是我从here 得到的一个例子:

rsync -avz foo:src/bar /data/tmp

-a 选项将保留权限、目录结构、所有权和符号链接。您也可以单独指定这些选项中的任何一个。

-v 和 -z 分别表示详细和压缩。虽然 -z 在复制大文件时很好用,但实际上并不需要它们。

【讨论】:

【参考方案3】:

只是为了补充其他解决方案:

对于一个 ascii/bin 文件,您可以这样做:

cat source_file | ssh host "test ! -f target_file && cat > target_file"

【讨论】:

【参考方案4】:
rsync -avz --ignore-existing /source folder/* user@remoteserver:/dstfolder/

--ignore-existing 不会覆盖远程服务器或目标服务器上的文件*。

【讨论】:

【参考方案5】:

我刚刚发现了一个简单的 hack。将现有文件标记为只读。

【讨论】:

如果您不想覆盖现有文件,这非常有意义:chmod u-w srcfile; scp -p srcfile $USER@$host:$directory/。来自 scp 手册页:-p Preserves modification times, access times, and modes from the original file.【参考方案6】:

我过去曾为此使用过 rsync,但发现自己试图从带有 CopSSH 而没有 rsync 的 windows 框中抓取 :-( 以下对我来说效果很好,使用文件测试来消除可能会出现的文件覆盖,并生成对 sftp 实例的多个“获取”请求。

(  echo  'cd work/ftp/' ; 
   ssh <user>@<machine> 'cd work/ftp/ && ls -1 ITEM_SALE_SUMMARY_V.*.dat.xz' |
   while read line; do [[ -f "$line" ]] || echo get "$line"; done 
) | sftp  <user>@<machine>

以防其他人需要非 rsync 解决方案!

【讨论】:

【参考方案7】:

rsync over ssh 必须是。

【讨论】:

以上是关于使用 Scp 时防止覆盖文件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

scpparamikorsync复制文件的区别

如何防止在“作曲家更新”命令时覆盖文件

如何防止web.config在网站更新时使用webdeploy覆盖

覆盖文件实际上会覆盖它吗? [关闭]

Elastic Beanstalk 防止文件覆盖

如何防止在 Python 中使用 FTPLIB 覆盖现有文件?