Как RSYNC одного файла?

95

В настоящее время я использую только RSync, 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/

Как упоминалось в комментариях: поскольку -aвключает рекурсию , одна небольшая опечатка может привести к запуску полного переноса дерева каталогов, поэтому более надежный подход может просто использовать -vzили заменить его на -lptgoD.

Майкл Плейс
источник
19
Также, если вы отправляете только один файл, вы можете добавить параметр «--progress», чтобы вы могли наблюдать за его прогрессом.
JoshStrange
означает ли это, что вам все еще нужен модуль в rsyncd.conf с каталогом над файлом (например, с опцией отказа удалить), или вы можете загружать файлы в любое место на сервере, просто указав путь к нему? На странице руководства это не совсем понятно.
3
-a включает рекурсию, и это не требуется для одного файла, не уверен, что я буду использовать этот флаг для одного файла, поскольку это может привести к непреднамеренному поведению, если имя файла случайно станет каталогом.
redanimalwar
2
--partial --stats --progress << Эти флаги полезны, если это действительно большой файл, и его, возможно, придется возобновить после прерывания передачи.
Ahi Tuna
14

Ответ Майкла Плейса отлично работает, если по отношению к корневому каталогу как для источника, так и для цели все каталоги в пути к файлу уже существуют.

Но что, если вы хотите синхронизировать файл с этим исходным путем:

/ исходный-корень / а / б / файл

в файл со следующим целевым путем:

/ целевой-корень / а / б / файл

а каталоги a и b не существуют?

Вам нужно запустить команду rsync, как показано ниже:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]
Кенни Эвитт
источник
2
Не было бы безопаснее просто скопировать отдельный файл в существующую папку или создать папки заранее? В случае синхронизации содержимого папки или папки давайте rsync создаст все подпапки, в конце концов, это его работа, но в данном конкретном случае слишком сложно и сложно использовать параметры --include только для копирования отдельных файлов.
Tulains Córdova
@ user1598390 Я не уверен, какой сценарий вы предполагаете или представляете, где это было бы менее безопасно, но если вы пытались запомнить конкретную форму этой команды, и вы делали это не часто, то да, вероятно менее безопасно, чем копирование одного файла. Это может быть безопаснее, если файл большой, т.е. потому что rsync автоматически обрабатывает большинство ошибок, которые могут возникнуть во время копирования. Для некоторого контекста мой синтаксис был особенно полезен для меня, потому что я написал код, который генерировал команды в этой форме, поэтому, учитывая достаточные тесты, охватывающие соответствующий код, эти команды являются «безопасными».
Кенни Эвитт,
0

На сегодняшний день два ответа не совсем правильные, они получат более одного файла, а другой не так прост, как мог бы быть, вот более простой ответ, ИМО.

Следующее получает ровно один файл, но вы должны создать каталог назначения с помощью 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 может создать для вас каталоги, если вы сделаете следующее. Это, вероятно, займет немного больше времени, поскольку выполняется поиск в большем количестве каталогов. Кроме того, он создаст пустые каталоги для каталогов в / remote / path, которых нет в ./local

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

Имейте в виду, что порядок --include и --exclude имеет значение.

Самуэль
источник