scp, не заменяя существующие файлы в месте назначения

aptitude помнит, какие пакеты явно требовали и которые были только установлены из-за зависимостей. Это автоматически удалит пакеты, которые явно не требовали, когда они больше не необходимы.

apt-get пакеты обработок требуют явно и их зависимости то же.

Так лучшее использование aptitude, это помогает содержать Вашу систему в чистоте.

168
26.01.2016, 13:49
8 ответов

Использовать rsync, и передача -u если Вы хотите только обновить файлы, которые являются более новыми в исходном каталоге, или --ignore-existing пропускать все файлы, которые уже существуют в месте назначения.

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/

(Отметьте / на исходной стороне: без него rsync создал бы /remote/directory/directory.)

149
27.01.2020, 19:28
  • 1
    @Anthon я не понимаю Ваш комментарий и я не вижу ответ или комментарий chandra. --ignore-existing действительно добавляет без замены, какую потерю данных Вы видите? –  Gilles 'SO- stop being evil' 27.11.2013, 11:59
  • 2
    Извините, я только посмотрел на Ваш первый пример, который является, где у Вас может быть потеря данных (и, по моему скромному мнению, не, что OP, который попросили относительно), если Вы включаете - игнорируют - существующей потери данных не должно происходить. –  Anthon 27.11.2013, 12:08
  • 3
    Это не помогает, если удаленная система не имеет rsync легко доступный.... (Как Win32-OpenSSH) –  Gert van den Berg 25.10.2016, 11:00
  • 4
    @GertvandenBerg rsync довольно легко установить в Windows, не тяжелее, чем SSH. –  Gilles 'SO- stop being evil' 25.10.2016, 14:51
  • 5
    @Gilles: Правда, но все опции, кажется, вовлекают Cygwin DLLs... (Текущее состояние порта MS OpenSSH таково, что включения сжатия на scp достаточно для повреждения SCP...) (Получение rsync функциональный по Win32-OpenSSH также кажется нетривиальным - надо надеяться, который улучшается со временем) (Солярис 10 является другим примером, где сторонний пакет и --rsync-path необходим) –  Gert van den Berg 25.10.2016, 16:01

scp перезапишет файлы, если у Вас будут полномочия записи им.

Другими словами: можно сделать scp эффективно пропустите, сказали файлы путем временного удаления полномочий записи на них (если Вы - владелец файлов, который является).

88
27.01.2020, 19:28
  • 1
    Спасибо за это. Был точно прием, который я искал. –  saccharine 17.07.2013, 00:02
  • 2
    удостоверяется, что Вы копируете файлы назад, Вы добавляете *, чтобы сделать так. Пример scp -r user@server.com:/location/of/files/* /local/location/ –  Rick 27.05.2015, 22:16
  • 3
    находит. - тип f - должностное лицо, показанное root:root {} \; –  ling 21.08.2016, 22:58

Если можно сделать целевое содержание файла только для чтения:

find . -type f -exec chmod a-w '{}' \;

перед выполнением scp (это будет жаловаться и пропускать существующие файлы).

И возвратите их позже ( chmod +w получить umask базирующееся значение). Если бы файлы все не имеют разрешения записи согласно Вашему umask, необходимо было бы так или иначе сохранить полномочия так, чтобы можно было восстановить их.

(Ответ жабр перезаписывает существующие файлы, если локально они являются более новыми, я потерял ценные данные тот путь. Не понимайте, почему тот неправильный и вредный ответ имеет, так многие голосуют).

10
27.01.2020, 19:28
  • 1
    я не получаю его: как сделал rsync --ignore-existing заставьте Вас терять данные? –  Gilles 'SO- stop being evil' 27.11.2013, 12:01
  • 2
    я получил ошибку find: missing argument to '-exec' использование этой команды, и вместо этого должно было использовать: find . -type f -exec chmod a-w {} \;. Мой Linux плох, ymmv. –  wpearse 06.04.2015, 03:16
  • 3
    Это - лучший и более безопасный ответ. Корректная команда для изменения разрешения состоит в том, как @wpearse упомянул: find . -type f -exec chmod a-w {} \; –  Amir 17.10.2017, 19:41

Можно скопировать только новые файлы по дате. Использовать find

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/
12
27.01.2020, 19:28
  • 1
    , что +7 означает? –  Francis Kim 01.05.2017, 16:07
  • 2
    @FrancisKim это означает измененный 7 дней назад. Так этот выбор запроса любые *.gz файлы, измененные в течение прошлых 7 дней –  Vadim Eremeev 25.05.2017, 00:34
  • 3
    +7 на самом деле не подразумевает больше чем 7 дней назад? –  Jeff H. 22.03.2018, 00:51
​​

У меня была аналогичная задача, в моем случае я не мог использовать rsync , csync или FUSE, потому что мое хранилище имеет только SFTP. rsync не может изменить дату и время для файла, некоторые другие утилиты (например, csync ) показали мне другие ошибки: « Невозможно создать временный файл Обнаружен перекос часов ".

Если у вас есть доступ к серверу хранения - просто установите openssh-server или запустите здесь rsync как демон.

В моем случае - я не мог этого сделать, и решение было: lftp . lftp используется для синхронизации ниже:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/ src / folder - это папка на моем компьютере, / rem / folder - это sftp: //sft.domain.tld/rem/folder.

Справочные страницы можно найти по ссылке: http://lftp.yar.ru/lftp-man.html

6
27.01.2020, 19:28

scp перезаписывает файлы, и нет переключателя, чтобы остановить это, но вы можете скопировать все существующие файлы, выполнить scp, а затем скопировать существующие файлы обратно. Примеры:

  1. Скопируйте все существующие файлы по пути

    mkdir original_files ; cp -r * original_files/
    
  2. Скопируйте все с помощью scp

    scp -r user@server:dir/* ./
    
  3. Скопируйте оригинальные файлы поверх всего, что записал scp:

    cp -r original_files/* ./
    
-2
27.01.2020, 19:28

Для копирования целого набора файлов быстрее использовать tar. Используя -k, вы также предотвращаете перезапись файлов при распаковке tar на целевой системе.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 
6
27.01.2020, 19:28

Другой способ добиться этого — выполнить lsв папке назначения:

В удаленной папке назначения:

ls | awk '{print "mv " $1 "../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

По источнику:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

В пункте назначения:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer
0
27.01.2020, 19:28

Теги

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