Я пишу сценарий для автоматического копирования файла с помощью rsync с server-a на server-b, это мой сценарий:
#!/bin/bash
NOW=$(date +"%Y-%m")
rsync -au --ignore-existing /var/www/uploads/$NOW/* -e root@1.1.2.2:/var/www/uploads/$NOW/.
когда мы собираемся в следующем месяце, например, с октября по ноябрь, я получаю эту ошибку в моем скрипте:
`
rsync: mkdir "/var/www/uploads/2014-11/." failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(605) [Receiver=3.0.9]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
`как мне исправить эту ошибку? пожалуйста, помогите мне
Во-первых, убедитесь, что родительский каталог на цели существует. Т.е. root@1.1.2.2:/var/www/uploads
должен существовать. Думаю, с вашей формулировкой конечный .
относится к каталогу, который пытается создать rsync, и не может этого сделать, если родительский каталог уже существует. т.е. родитель root@1.1.2.2:/var/www/uploads/$NOW
.
Во-вторых, имейте в виду, что поведение rsync несколько отличается от cp по-разному с завершающим символом '/' в имени файла. Я считаю, что самый безопасный и интуитивно понятный способ сделать что-то - использовать трейлинг /
в конце всех каталогов. Вот так:
rsync -au --ignore-existing /var/www/uploads/$NOW/ -e root@1.1.2.2:/var/www/uploads/$NOW/
В отличие от cp, rsync будет надежно копировать содержимое каталога в исходном аргументе в содержимое целевого каталога, создавая целевой каталог, если необходимо (хотя он должен существовать), и не помещать исходный каталог (то есть родительский) внутрь целевой каталог, если цель уже существует.
Это немного отличается от того, что вы делали, хотя то, как вы это делали, исключает файлы с именем, начинающимся с .
в исходном каталоге и завершится ошибкой, если список копируемых файлов будет слишком длинным (расширение bash ограничено общей длиной командной строки около 32 КБ символов, если память мне не изменяет).
Конечную точку необходимо удалить, измените сценарий на:
rsync -au --ignore-existing /var/www/uploads/$NOW/* -e root@1.1.2.2:/var/www/uploads/$NOW
Попробуйте это, чтобы rsync создал все необходимые каталоги в адресе:
NOW=$(date +"%Y-%m")
rsync -au --ignore-existing --relative /var/www/uploads/$NOW root@1.1.2.2:/var/www/uploads/
--relative
чтобы rsync создал дерево каталогов в месте назначения.$NOW
") также создается в месте назначения, а не только в его содержимом.-e
вариант, который выглядит как ошибка (потребуется аргумент: "Эта опция позволяет вам выбрать альтернативную программу удаленной оболочки для использования для связи.").Или посмотреть этот ответ для получения более подробной информации и альтернатив.