У меня есть команда rsync, которая сканирует для нахождения недавно созданных файлов и затем синхронизирует его с удаленным ПК. Оба ПК имели ту же файловую структуру до недавнего времени.
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 / daisy@melbourne.11111.net:/
В этом случае недавно созданные фильмы от /mnt/movies/
отправляются месту назначения в том же месте (/mnt/movies/
).
Теперь я должен отправить их в /mnt/drive/movies/
который является изменением, но ни за что в жизни я не могу разработать, как сделать это.
Я понимаю /
после --files-from=- --from0
причины rsync для размещения вывода находки в /
каталог места назначения, изменяясь /
кому: /mnt/drive/
причины rsync для создания каталога /mnt/movies/...
в /mnt/drive
папка. То, что я хотел бы видеть, /mnt/drive/movies/movie1/1.mkv
Надежда кто-то может помочь мне с этим:/
Я только частично протестировал свое решение, поскольку у меня нет удаленной системы, но я понимаю, что Ваша проблема синхронизирует от /
кому: /
(все дерево). rsync
примет источник и место назначения, но find
дает Вам полные пути, таким образом, это может только работать при синхронизации целого дерева. Моя первая мысль состояла в том, чтобы использовать sed
снять ведущую роль путей и затем указать источник к rsync
таким образом, это может найти те файлы и указать место назначения также
find ... | sed -z 's/^\/mnt\/movies\///' | rsync ...
(использование -z
сказать sed
использовать ПУСТЫЕ разделители от -print0
и для --from0
)
Но, steeldriver услужливо указанный в комментарии, что мы можем достигнуть того же самого без sed
использование printf '%P\0'
вместо просто print0
в find
команда, и это делает точно то же как мою идею, но намного более изящно (отбрасывание части пути, указанного в команде).
Делая это, каждый путь к файлу будет справедлив movie1/1.mkv
. Так, в конце, вместо --from0 / daisy@melbourne.11111.net:/
сказать rsync
где искать тот путь, и где найти место назначения в удаленной системе:
--from0 /mnt/movies daisy@melbourne.11111.net:/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 daisy@melbourne.11111.net:/mnt/drive/movies