仅当文件不存在时才将其传输到远程目录而不替换

仅当文件不存在时才将其传输到远程目录而不替换

我使用的是CentOS Linux。

在一行 cmd 中,如果成功则返回 0,如果失败则返回非 0,我需要:

  1. 将文件传输到远程服务器。
  2. 如果远程服务器中存在文件名,则不传输文件(返回非 0)

我想过使用rsync,但如果文件名存在它会返回 0 。 scp替换现有文件,所以它对我也没有帮助。

一个转折:执行该命令的用户是不是root,文件归该用户所有。目的地由同一用户拥有。ssh对 root存在信任。但不适用于该用户。无法提示输入密码,因为此命令是自动脚本的一部分。可以进行初步配置步骤。我可以将它们添加为一次性配置。有人可以帮忙吗?

答案1

这是一种不保留元数据的简单方法:

ssh server.example.com 'set -C; cat >/path/to/remote/file' </path/to/local/file

您可以使用 rsync 并使用正确的选项来完成此操作。如果文件存在,返回码将为 0,但您可以从详细输出中找到。

changes=$(rsync -a --ignore-existing --itemize-changes \
                /path/to/local/file server.example.com:/path/to/remote/file)
if [ $? -ne 0 ]; then
  echo >&2 "Some error occured"
  return 2
elif [ -n "$changes" ]; then
  echo "The file was copied"
  return 0
else
  echo "The file already existed"
  return 1
fi

答案2

首先检查远程主机上是否存在该文件:

if ! ssh remotehost [ -f incoming/DB1026910.sql ]; then
    scp DB1026910.sql remotehost:incoming/
fi

相关内容