Як RSYNC один файл?


95

В даний час я лише RSync-in Directories, як:

* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html

Отже, як мені rsyncодин файл, наприклад /var/www/public_html/.htaccess,?

Відповіді:


160

Ви робите це так само, як і каталог, але вказуєте повний шлях до імені файлу як джерело. У вашому прикладі:

rsync -avz   --progress  /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/

19
Крім того, якщо ви надсилаєте лише один файл, ви можете додати параметр "--progress", щоб ви могли спостерігати за його прогресом.
JoshStrange

чи означає це, що вам все-таки потрібен модуль у rsyncd.conf з каталогом над файлом (наприклад, з можливістю відмови від видалення), або ви можете завантажувати файли де-небудь на сервері, просто вказавши його шлях? Сторінка користувача насправді не зрозуміла з цього приводу.

2
-a включає рекурсивний, і це не потрібно для одного файлу. Не впевнений, чи використовуватиму я цей прапор для одного файлу, оскільки це може призвести до ненавмисної поведінки, якщо ім'я файлу випадково стане каталогом.
redanimalwar

2
--partial --stats --progress << Ці прапори корисні, якщо це справді великий файл і, можливо, доведеться відновити його після перерваної передачі.
Ахі Туна,


14

Відповідь Майкла Плейса чудово працює, якщо щодо кореневого каталогу як для джерела, так і для цілі всі каталоги у шляху до файлу вже існують.

Але що, якщо ви хочете синхронізувати файл із цим вихідним шляхом:

/ source-root / a / b / файл

у файл із таким цільовим шляхом:

/ target-root / a / b / файл

а каталоги a і b не існують?

Вам потрібно запустити команду rsync, як показано нижче:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]

2
Чи не було б безпечніше просто скопіювати окремий файл до існуючої папки або створити папки заздалегідь? У разі синхронізації папки або вмісту папки, давайте rsync створить усі вкладені папки, адже це його робота, але в цьому конкретному випадку це занадто багато клопоту і хитрощі --indelute параметри просто для копіювання окремих файлів.
Tulains Córdova

@ user1598390 Я не впевнений, який сценарій ви припускаєте або уявляєте, де це було б менш безпечним, але якщо ви намагалися запам'ятати конкретну форму цієї команди, але не часто це робили, тоді так, ймовірно менш безпечний, ніж копіювання одного файлу. Це може бути безпечнішим, якщо файл великий, тобто тому, що rsync автоматично обробляє більшість помилок, які можуть виникнути під час копіювання. Для деякого контексту мій синтаксис був для мене особливо корисним, оскільки я написав код, який генерував команди у цій формі, тому, маючи достатню кількість тестів, що охоплюють відповідний код, ці команди є «безпечними».
Кенні Евітт,

0

На сьогодні дві відповіді не зовсім правильні, вони отримають більше одного файлу, а інший не такий простий, як може бути, ось простіша відповідь IMO.

Далі подається рівно один файл, але вам потрібно створити каталог dest за допомогою mkdir. Це, мабуть, найшвидший варіант:

mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/

Якщо в / remote / path є лише один екземпляр файлу, rsync може створити для вас каталоги, якщо ви зробите наступне. Це, ймовірно, займе трохи більше часу, оскільки він шукає більше каталогів. Плюс це створить порожні каталоги для каталогів у / віддаленому / шляху, які не знаходяться в ./local

cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .

Майте на увазі, що порядок - включати та - виключати має значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.