让 rsync 将文件从源移动到目标?

让 rsync 将文件从源移动到目标?

对于我的项目来说,rsync 是一个好的选择吗?

我必须:
- 通过 SSH 将文件从源文件夹复制到目标文件夹,
- 确保所有文件都已复制,
- 复制后删除源文件。
- 如果有冲突名称,我必须重命名文件。

看起来我可以使用选项:--remove-source-files(删除源文件)
但是 rsync 如何管理冲突,我可以有规则吗?

我的项目上的用例:

我在服务器 A 上运行科学计算,并将结果插入文件夹“process”中,对于每个计算,我都有一个这样的存储库:/process/calc1。
现在我想将存储库“/calc1”转移到服务器 B(我得到 /process/calc1),并从服务器 A 中删除“calc1”。...
在另一次计算期间,我在服务器 A 上得到“/process/calc2”,想法也是将“calc2”移动到服务器 B 上的“/process/”目录中,那么我现在在服务器 B 上有:
- /process/calc1
- /process/calc2
(服务器 A 上的 /process/ 为空)。

如果我在新计算之后在服务器 A 中有了另一个类似“/process/calc1”的文件夹(如果服务器 B 上已经存在“/process/calc1”),rsync 将如何管理冲突(在服务器 B 上)?

是否可以使用 rsync 添加规则,并在服务器 B 中将“/process/calc1”重命名为“process/calc1R2”? 依此类推(例如:calc1R3)?

谢谢。

答案1

如果你真的想使用 rsync,听起来你需要 --backup、--backup-dir 和 --suffix 的组合。我认为你能得到的最接近的方法是这样的

rsync -abv --suffix R1 --remove-source-files src/ dst/

这会接近您想要的效果,但不会完全按照您想要的方式重命名文件。 --suffix 选项会将文本附加到现有文件的末尾,但只在第一次冲突时执行此操作。如果您再次运行它,它只会覆盖您的第一个备份。每次运行命令时,您都必须更改该后缀值,如果您使用带有时间戳的内容,例如:

rsync -abv --suffix `date +%Y%m%d%k%M%S` --remove-source-files src/ dst/

我不确定这是否超出了你的要求,但它应该可以满足你的要求。

答案2

顾名思义,rsync 用于同步文件。当“同步”时,这意味着源和目标上的文件是相同的。这似乎不是您想要做的。

看起来您只是想移动一些文件。您不需要为此使用 rsync。看起来您正在使用 Linux 或 BSD。您可以通过 ssh 使用 mv -n。-n 选项不会覆盖现有文件。这不是 100% 自动的。但是,我不明白在您的情况下文件怎么会已经存在。文件将从源复制到目标,然后从源中删除。您想再次运行相同的计算吗?这就是为什么您最终会得到同名文件的原因吗?我建议在文件夹名称后附加运行或批号。无论如何,您都希望这一点清晰明了。您可以控制文件夹的命名方式吗?还有其他详细信息吗?我建议将命令放在 bash 脚本或类似脚本中。

答案3

对于 SSH,总而言之,使用以下命令:

通过远程 shell 访问:

拉取:rsync [OPTION...] [USER@]HOST:SRC... [DEST]

推送:rsync [OPTION...] SRC... [USER@]HOST:DEST

这一切都在 rsync(1) 中解释过了。

至于为 cronjob 编写脚本,以便自动通过 ssh 进行 rsync 而不需要密码,也请查看 ssh-agent(1)。

相关内容