我有一个 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'
情况下实现同样的事情,这与我的想法完全相同,但更加优雅(丢弃命令中指定的路径部分)。print0
find
这样做之后,每个文件路径就只是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