bsdtar cf - . | xz | pv -L 3m | ssh host 'cd /there && xz -d | bsdtar xpSf -'
(здесь использующий bsdtar, поскольку другие обычно не хранят все метаданные файла).
xz
вероятно, лучшее сжатие, которое можно получить (но очень интенсивный ЦП),pv
для ограничения уровня (отмечают, что это - 3 мега (220)байты в секунду).Добавьте
--numeric-owner
опция к второмуbsdtar
если это для резервного копирования, и Вы хотите сохранить uids/gids.Это было бы более эффективно (с точки зрения пропускной способности и ресурса на обоих серверах), чем использование
rsync
(сxz
сжатие) для полной передачи, но если необходимо возобновить передачу или синхронизирующие папки, у которых есть общие файлы, это то, гдеrsync
прибывает удобный (но читайтеrsync
страница справочника тщательно для выбора, какие опции необходимо сохранить метаданные, которые Вы хотите сохранить).
Это простая функция оболочки ( bash
и ksh93
), который является оболочкой вокруг scp
. Он откажется выполнять настоящий scp
, если целевой файл существует в системе.
function scp
{
typeset argv="$@"
typeset target="${argv[-1]}"
if [[ -e "$target" ]]; then
echo 'Target file exists, refusing to overwrite' >&2
return 1
fi
command scp "$@"
}
Функция выбирает цель из последнего аргумента командной строки, а затем проверяет, соответствует ли она существующему имени файла. Если это так, он отказывается выполнять scp
, отображает диагностическое сообщение и возвращает ненулевой статус выхода.
Если имя файла, соответствующее целевому файлу, отсутствует, он продолжает и вызывает реальный scp
с исходной командной строкой.
Не делается попыток различить передачу в том или ином направлении. Таким образом, он завершится ошибкой, если в текущем каталоге есть имя файла, соответствующее формату типа user @ hostname: file
.
Если у вас есть список защищенных имен файлов в файле (это должен быть список абсолютных путей, по одному в каждой строке, соответствующих реальному пути к каждому файлу, возвращенному утилитой GNU coreutils realpath
):
function scp
{
typeset argv="$@"
typeset target="${argv[-1]}"
if grep -q -F -x "$( realpath "$target" )" protected_files.txt; then
echo 'Target filename is protected, refusing to overwrite' >&2
return 1
fi
command scp "$@"
}