rsync——将文件列表复制到远程目录

rsync——将文件列表复制到远程目录

我有一个 rsync 命令,它可以扫描以查找新创建的文件,然后将其与远程 PC 同步。直到最近,两台 PC 都具有相同的文件结构。

find /mnt/movies -type f -ctime -1 -print0 | rsync -0Prvuz --log-file=/home/daisy/rsync/movies.log -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --files-from=- --from0 / [email protected]:/

在这种情况下,新创建的电影将/mnt/movies/被发送到同一位置的目的地(/mnt/movies/)。

现在我需要将它们发送给那里,/mnt/drive/movies/这是一个变化,但我无论如何也想不出如何做到这一点。

我理解/after--files-from=- --from0会导致 rsync 将 find 的输出放入/目标目录中,将 to 更改/为会导致 rsync 在文件夹内/mnt/drive/创建目录。我希望看到的是/mnt/movies/.../mnt/drive/mnt/drive/movies/movie1/1.mkv

希望有人能帮助我:/

答案1

我只部分测试了我的解决方案,因为我没有远程系统,但我知道你的问题是从同步//(整个树)。rsync将接受源和目标,但find会给你完整的路径,所以只有你同步整个树时它才能工作。我的第一个想法是使用sed去掉路径的前半部分,然后指定源,rsync以便它可以找到这些文件,并指定目标

find ... | sed -z 's/^\/mnt\/movies\///' | rsync ...

(使用-z来告诉在和 中sed使用 NULL 分隔符)-print0--from0

但,钢铁司机在评论中有帮助地指出,我们可以在不sed使用命令的printf '%P\0'情况下实现同样的事情,这与我的想法完全相同,但更加优雅(丢弃命令中指定的路径部分)。print0find

这样做之后,每个文件路径就只是movie1/1.mkv。所以,最后,不是告诉在哪里寻找该路径,而是告诉在远程系统上哪里找到目标:--from0 / [email protected]:/rsync

--from0 /mnt/movies [email protected]:/mnt/drive/movies

对于我来说,本地复制非常有效。

建议完整命令:

find /mnt/movies -type f -ctime -1 -printf '%P\0' | rsync -Prvuz --log-file=/home/daisy/rsync/movies.log -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --files-from=- --from0 /mnt/movies [email protected]:/mnt/drive/movies

相关内容