rsync --remove-source-files 但仅限那些与模式匹配的文件

rsync --remove-source-files 但仅限那些与模式匹配的文件

使用 rsync 可以实现这个吗?

将所有内容从转移src:path/to/dirdest:/path/to/other/dir并删除一些源文件中src:path/to/dir符合模式(或大小限制)的文件,但保留所有其他文件。我找不到--remove-source-files使用正则表达式或大小限制进行限制的方法。

更新1(澄清):我希望src:path/to/dir将 中的所有文件复制到dest:/path/to/other/dir。完成后,我想src:path/to/dir删除 中的某些文件(那些符合正则表达式或大小限制的文件),但不想删除 中的任何内容dest:/path/to/other/dir

更新2(更多说明):不幸的是,我无法简单地 rsync 所有内容,然后从 src: 手动删除与我的正则表达式匹配的文件。要删除的文件会不断创建。

假设在 rsync 启动时,src: 中有 N 个我想在传输后删除的文件类型。到 rsync 完成时,那里将有 N+M 个这样的文件。如果我现在手动删除它们,我将丢失在 rsync 运行时创建的 M 个文件。

因此,我希望有一个解决方案,可以保证从 src: 删除的文件都是已知已成功复制到 dest: 的文件。我可以在 rsync 完成后从 dest: 获取文件列表,并将该文件列表与 src: 中的文件进行比较,然后手动删除。但我想知道 rsync 是否可以自行完成此操作。

答案1

您想在传输前删除还是在传输后删除?也就是说,dest: 中应该有已删除的文件吗?

我认为最简单的方法是将这些作为单独的命令执行。使用find | xargs rm删除所需文件(egrep如果正则表达式很复杂,则可能需要向管道添加)并rsync进行复制。执行顺序将由第一段中对我的问题的回答决定。

答案2

最有可能的是,做你想做的事情的“正确”方法是通过使用函数进行查找 - 这让你可以以“几乎原子”的方式做到这一点。

我还建议使用 mtime - 这可以防止它执行仍在写入的文件 - 尽管可能还有其他更好的方法可以避免这种情况。

另请参阅https://unix.stackexchange.com/questions/50692/executing-user-defined-function-in-a-find-exec-call了解导出函数的相关方法。以下示例特定于 bash:

pattern='^match\.this\.pattern.*only$'

rsync_rm() {
 rsync path/to/dir/$1 dest:/path/to/other/dir/.
 echo $1 | egrep $pattern > /dev/null && rm $1
}

export -f rsync_rm

find path/to/dir -mtime +1 -exec bash -c 'rsync_rm "$@"' bash {} +

相关内容