Я знаю, что могу сказать:
rsync -zaP uploads/ myserver:/path/to/
Если я правильно понимаю, это сжимает каждый файл в этом каталоге и синхронизирует его с сервером один за другим. Но если это тысячи файлов, это займет некоторое время. Гораздо быстрее было бы сжать весь каталог и загрузить его.
Итак, есть ли у меня фарфоровый способ сделать это с rsync
?
Я написал небольшую функцию bash для сжатия и перемещения всего каталога с помощью rsync
. Как бы вы его упростили или улучшили?
function zipsync() {
# Arguments
local source=$1
local target=$2
# Get the host and path from the $target string
IFS=':' read -a array <<< "$target"
local host=${array[0]}
local remote_path=${array[1]}
# The archive file locations
local remote_archive=${remote_path}${source}.tar.gz
local local_archive=${source}.tar.gz
# Colors
cya='\033[0;36m'; gre='\033[0;32m'; rcol='\033[0m'
echo -e "$cya Compressing files $rcol"
tar -zcvf $local_archive $source
echo -e "$cya Syncing files $rcol"
rsync -avP $local_archive $target
echo -e "$cya Extracting file in remote $remote_archive $rcol"
ssh $host "cd ${remote_path}; tar zxvf ${remote_archive}"
echo -e "$cya Removing the archives $rcol"
ssh $host "rm $remote_archive"
rm $local_archive
echo -e "$gre All done :) $rcol"
}
Синтаксис:
zipsync source target
Пример:
$ zipsync uploads my_server:/var/www/example.com/public_html
Проблемы с этой функцией:
zipsync uploads -p 5555 bob@xmpl.com:/path/
вызвать -p
читается как второй параметр.Моей целью было создать команду, которая действительно проста в использовании и собирает rsync
.
Если я правильно понимаю,
rsync -zaP uploads/ myserver:/path/to/
будет сжимать каждый файл в этом каталоге и синхронизировать один за другим с сервером.
Это неверно. В rsync
команда просматривает локальные файлы, сравнивает их с удаленными файлами (если есть), а затем синхронизирует различия к серверу. Если нет подходящих удаленных файлов, скорость не будет увеличиваться. Однако для последующих загрузок, когда были изменены только некоторые файлы, увеличение скорости может стать значительным. В -z
flag пытается применить сжатие к данным, передаваемым по ссылке.
Но если это тысячи файлов, это займет некоторое время. Гораздо быстрее было бы сжать весь каталог и загрузить его. Итак, есть ли у меня фарфоровый способ сделать это с помощью rsync?
Ваше понимание было ошибочным, поэтому я думаю, что этот вопрос становится спорным. Остальная часть вашего сообщения, похоже, не является вопросом, поэтому я не уверен, каких ответов вы ожидаете. Обновите вопрос, если я ошибаюсь.
Если вы хотите запустить это только один раз, когда место назначения пусто, тогда это может быть быстрее, да.
Но ваша функция слишком сложна.
Вы можете просто запустить:
tar zcvf - /source | ssh destination.example.com "cd /destination; tar xvzf -"
Если вы хотите запустить синхронизацию для синхронизации изменений, посмотрите ответ от roaima.