it-swarm-ru.tech

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

Как скопировать весь каталог в одноименный каталог без замены содержимого в целевом каталоге? (вместо этого я хотел бы добавить к содержимому папки назначения)

169
biznez

Используйте 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

scp перезапишет файлы, если у вас есть права на запись в них.

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

88
Reimund

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

scp  `find /data/*.gz -type f -mtime +7` [email protected]:/backup/
12
Naks

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

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

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

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

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

10
Mohad

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

tar -c <source-dir> | ssh <name>@<Host> 'tar -kxzf - -C <target-dir>' 
7
huembi

У меня была похожая задача, в моем случае я не мог использовать 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
bolD

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

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

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

    scp -r [email protected]:dir/* ./
    
  3. Скопируйте исходные файлы поверх всего, что написал scp:

    cp -r original_files/* ./
    
0
A.Badger