有什么想法可以简化下面尴尬的 rsync 表达式吗?

有什么想法可以简化下面尴尬的 rsync 表达式吗?

这是表达式:

rsync -avz --progress -e "ssh -i /where/is/my/id_dsa" [email protected]:`ssh -i /where/is/my/id_dsa  [email protected] "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"` .

它在远程主机上寻找一个新的 SQL 文件 某个.host/远程/源/目录与用户维维克 并复制到本地主机上的当前目录,它使用/where/is/my/id_dsa密钥sshrsync授权。

所以这个反引号ssh -i ...让我很害怕。但我没有看到其他方法来找到必要的文件。我怎样才能简化它?

答案1

您可以通过将以下配置添加到 .ssh/config 中来简化命令:

    托管一些.host
        身份文件 /where/is/my/id_dsa
        用户维维克

现在你的命令很简单

rsync -avz --progress -e "ssh some.host:`ssh some.host "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"` .

通常我更喜欢 --partial --progress 而不是 --progress,它有一个更短的选项“P”,所以你的命令是

rsync -avzPe "ssh some.host:`ssh some.host "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"` .

如果您将过去传输过的所有sql文件都保留在当前目录中,则无需选择性地选择要传输的文件,因为rsync会为您进行比较,并且不会重新传输现有文件。所以你的命令可以进一步简化为

rsync -avzPe "ssh some.host:`ssh some.host "find /remote/source/dir -type f -name '*.sql'"` .

最后,您可以在命令中使用 rsync 的过滤规则

rsync -avzP some.host:/remote/source/dir/**/*.sql .

请小心使用上面的命令,因为子目录结构将被剥离。首先尝试使用 --dry-run 运行它。另请注意,您不需要 -e ssh blah,因为单个“:”将自动告诉 rsync 使用 ssh 代替。如果这不能满足您的需求,请告诉我。

干杯!

答案2

首先,您可以通过添加别名来简化 SSH 命令~/.ssh/config文件。

Host somehost
HostName some.host
User vivek
IdentityFile /where/is/my/id_dsa

进入正题:您需要执行两个步骤,首先确定要复制哪个文件(必须在远程端完成),然后复制或更新该文件。如果您不必担心哪些文件是远程的、哪些文件是本地的,那就更容易了。因此挂载远程文件系统sshfs

mkdir somehost
sshfs somehost:/ somehost

您现在可以完全对本地文件进行操作。您可能应该将该--no-whole-file选项传递给rsync,因为否则它会假设本地文件系统速度很快并且始终会复制整个文件而不是应用其增量增量算法。

rsync -avz --progress --no-whole-file $(find somehost/remote/source/dir -type f -name '*.sql' | sort -nr | head -1) .

现在,不要使用 call ,而是find使用 zsh 作为 shell。像大多数find电话一样,您的电话可以被几个电话取代全局限定符: .for -type fOn用于数字排序,并且[1]仅保留第一个匹配项。

rsync -avz --progress --no-whole-file somehost/remote/source/dir/**/*.sql(.on[1]) .

相关内容