Назад | Перейти на главную страницу

Сжать весь каталог с помощью rsync и загрузить на удаленный компьютер

Я знаю, что могу сказать:

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

Проблемы с этой функцией:

  1. Невозможно завершить вкладку на локальном компьютере.
  2. Невозможно завершить вкладку на удаленном сервере.
  3. Не могу указать порт в целевом пути, это не сработает: 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.