Для получения rsync cronjob работа я должен сначала создать дерево dir на удаленном сервере прежде, чем выполнить rsync. Локальные каталоги должны быть зеркально отраженный (w/o содержание) к удаленному серверу. Я - strugglying, чтобы сделать это.
То, в чем я нуждаюсь, является 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 hotcopy (/conf, / дб, / рычаги,/dav...)
Спасибо
Не ясно, почему необходимо сделать все те каталоги использованием mkdir
.
Единственный каталог, который необходимо должны быть создать, является самим целевым каталогом, и это - то, только если он уже не существует. rsync
создаст весь subdirs, если Вы будете использовать -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
цикл с другой стороны читает одну строку за один раз и делает что-то с нею (в этом случае, делает каталог).
Если Вы использовали 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'
Я не вполне понимаю то, чего Вы пытаетесь достигнуть здесь. Я использую rsync все время и никогда не должен был предварительно делать каталоги на сервере.
rsync -avP /home/local_directories/onedir/ user@server:/where/to/sync/to/
должен просто зеркально отразить целое дерево под onedir от локального до удаленного.