![rsync 的 --remove-source-files 选项的用法](https://linux22.com/image/113494/rsync%20%E7%9A%84%20--remove-source-files%20%E9%80%89%E9%A1%B9%E7%9A%84%E7%94%A8%E6%B3%95.png)
从联机帮助页rsync
--删除源文件
这告诉 rsync 从发送端删除文件(意味着非目录)那是转让的一部分并且已经在接收端成功复制。
这是否意味着发送方的文件要么是传输的一部分,要么是在接收方重复的?
我还可以删除发送端的目录吗?
请注意,您只能在以下位置使用此选项静态源文件。
- “静态源文件”是什么意思?
如果您使用此功能将特定目录中显示的文件移动到另一台主机,请确保将完成的文件重命名到源目录中,而不是直接写入其中,以便 rsync 无法传输以下文件:还没有完全写完。
- 这是什么意思?
如果您无法首先将文件写入不同的目录,则应该使用命名习惯,让 rsync 避免传输尚未完成的文件(例如,在写入文件时将其命名为“foo.new”,将其重命名为“ foo”完成后,然后使用选项 --exclude='*.new' 进行 rsync 传输)。
- 这是什么意思?
从 3.1.0 开始,如果文件的大小或修改时间没有保持不变,rsync 将跳过发送方删除(并输出错误)。
- 这是什么意思?
谢谢。
答案1
问:这是否意味着发送方的文件是传输的一部分或在接收方重复的文件?
- 答:两者都有
问:我还可以删除发送端的目录吗?
- 答:是的
--remove-source-files
然后发出命令
find <source_directory> -type d -empty -delete
OR
find <source_directory> -type l -type d -empty -delete
(在删除中包含符号链接)
(曾是:)--remove-source-files
然后发出命令rm -rf <source_directory>
警告:
正如 OrangeDog 的评论中提到的,该rm -rf
建议是不安全的。具体来说,由于任何原因未传输的任何文件(在构建传输列表和开始实际传输该文件之间更改的文件、接收端磁盘空间不足、网络连接断开等)将在源目录中保持不变通过 rsync — 但在你rm -rf
调用之后它们就消失了。上面的命令find
将递归删除空的源树如果所有源文件都已成功传输和删除,但不会保留任何剩余文件(当然还有它们包含的目录)。
问:“静态源文件”是什么意思?
- A:表示已写入并关闭的文件
问:如果您使用此功能将特定目录中显示的文件移动到另一台主机,请确保将完成的文件重命名到源目录中,而不是直接写入其中,以便 rsync 无法传输尚未完全写入的文件。这是什么意思?
- 答: 就是我上面说的意思
问:如果您无法先将文件写入不同的目录,则应该使用命名习惯,让 rsync 避免传输尚未完成的文件(例如,在写入文件时将其命名为“foo.new”,然后将其重命名)完成后改为“foo”,然后使用选项 --exclude='*.new' 进行 rsync 传输)。这是什么意思?
- 答:这意味着 RSYNC 会先列出要传输的文件列表。然后它将它们写入不同的目录(目标目录),因此,如果您传输尚未完成的文件,最好在完成后使用 --exclude 选项重命名它
问:从 3.1.0 开始,如果文件大小或修改时间没有保持不变,rsync 将跳过发送方删除(并输出错误)。这是什么意思?
- 答:如果 RSYNC 在将文件写入目标目录时检测到文件大小在扫描文件到实际写入目标目录之间发生了变化,则 RSYNC 将跳过该文件。
答案2
与之相反另一个答案在这个问题上,在某种条件下混合--remove-source-files
和混合是安全的。rm -rf
不过,让我们稍微回答一下您的其他具体问题。
该--remove-source-files
标志将安排在文件被正确且完整地复制到目标后将其删除。它们可能是在本次会话期间或在某些可能的早期会话期间被复制的;没关系。
该标志不会删除发送端的目录,只会删除文件。通常的方法是天真地调用rm -rf
.如果传输失败,这可能是灾难性的。这里的解决方案是确保仅rsync
在完全正确地传输所有文件后调用它
rsync -a src/ dst && rm -rf src
需要注意的是,这里存在隐含的竞争条件。如果树中的文件在处理src
后被创建或修改,则尽管不再正确同步到远程系统,rsync
该文件仍将被默默地完全删除。rm
如果您控制树中的文件src
并且可以确信这种情况不会发生,那么您就可以安全地使用此rsync && rm
构造。
较新版本rsync
可以检测已更改的文件期间他们的副本。 (不是在 的整个复制过程中src
,而是仅在 的复制过程中src/.../file
。)他们通过在文件复制的开始和结束时比较文件的大小和修改时间来做到这一点。如果文件发生更改,则会出现错误。