Чтобы заставить работать rsync cronjob, мне нужно сначала создать дерево каталогов на удаленном сервере, прежде чем запускать rsync. Локальные каталоги должны быть зеркально отображены (без содержимого) на удаленном сервере. Я изо всех сил пытаюсь сделать это.

Что мне нужно, это stg, как это:

find /home/local_directories/onedir/* -type d -exec sh -c "ls -dlts {}"  \; | 
    cut -d" " -f10 | uniq | ssh user@server mkdir -p /tmp/{xargs}  

Сложность в том, как запустить последнюю трубу?

РЕДАКТИРОВАТЬ: команда rsync похожа на это (пробовал также с -R):

/usr/bin/rsync -e ssh -arz --stats --force /home/local_directories/onedir/ user@server:port:/exitsing/path/to/remote/dir/  

Исходное дерево - это горячая копия svn (/conf, /db, /hooks, /dav, ...)

Спасибо

2 ответа2

1

Непонятно, зачем вам нужно создавать все эти каталоги, используя mkdir .

Единственный каталог, который вам нужно создать, это сам каталог назначения, и это только в том случае, если он еще не существует. rsync создаст все подкаталоги, если вы используете опцию -a или -v .

Примерно так должно быть достаточно:

destdir="/home/local_directories/onedir.bak"  # or wherever it should go
ssh user@server "mkdir \"$destdir\""
rsync -a /home/local_directories/onedir/ user@server:"$destdir"

Или правильнее (только создание каталога, если он не существует):

destdir="/home/local_directories/onedir.bak"
ssh user@server 'destdir="'"$destdir"'"; test -d "$destdir" || mkdir -p "$destdir"'
rsync -a /home/local_directories/onedir/ user@server:"$destdir"

Но если вам действительно нужно это сделать, и по какой-то причине действительно требуется ls -ltds , вам придется исправить свой бит {xargs} чтобы он заработал .

Самый правильный и эффективный способ сделать последний шаг -

find ... |
    ssh user@server 'while IFS=$'"\n"' read -r dir; do test -d "$dir" || mkdir -p "$dir"; done'

Идея заключается в том, что мы только начинаем find и ssh один раз. Мы начинаем find и ssh вместе в конвейере, и команда find отправляет свой вывод на удаленный сервер через ssh .

find производит одну строку вывода на файл, затем цикл while read while с другой стороны читает по одной строке за раз и что-то делает с ней (в этом случае создает каталог).

Если вы используете xargs , он будет запускать ssh несколько раз, что замедлит работу.

Лучше, но немного сложнее, это:

find ... -print0 |
    ssh user@server 'while read -r -d "$(printf "\000")" -r dir; do test -d "$dir" || mkdir -p "$dir"; done'

Это лучше, потому что он обрабатывает странные символы в файлах, включая символы новой строки, которые очень редки, и плохая идея, но лучше обрабатывать их на всякий случай.


Так что, насколько я понимаю, вы должны просто делать что-то вроде:

find /home/local_directories/onedir/ -type d -print0 |
    ssh user@server 'while read -r -d "$(printf "\000")" -r dir; do test -d "$dir" || mkdir -p "$dir"; done'
0

Я не совсем понимаю, чего вы пытаетесь достичь здесь. Я использую rsync все время, и мне никогда не приходилось предварительно создавать какие-либо каталоги на сервере.

rsync -avP /home/local_directories/onedir/ user@server:/where/to/sync/to/

следует просто отразить все дерево под onedir от локального до удаленного.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .