цепочечные команды для создания каталогов на удаленном сервере

Для получения 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...)

Спасибо

0
задан 28.02.2011, 02:51

2 ответа

Не ясно, почему необходимо сделать все те каталоги использованием 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'
1
ответ дан 24.11.2019, 12:07

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

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

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

0
ответ дан 24.11.2019, 12:07

Теги

Похожие вопросы