scp, не замінюючи наявні файли в пункті призначення


158

Як скопіювати весь каталог у однойменний каталог без заміни вмісту в каталозі призначення? (замість цього я хотів би додати до вмісту папки призначення)


Так, це дратує , коли корисна програма / утиліта не має , що один «якщо тільки він міг ...» варіант! У цьому випадку "--ноклобер"!
MikeW

Відповіді:


139

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

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

(Зверніть увагу /на джерело з боку джерела: без цього не rsyncбуде створено /remote/directory/directory.)


@Anthon Я не розумію ваш коментар і не бачу відповіді чи коментарів від chandra. --ignore-existingдодає, не замінюючи, яку втрату даних ви бачите?
Жиль

Вибачте, я лише переглянув ваш перший приклад, коли ви можете втратити дані (і це IMHO не те, про що попросила ОП), якщо ви включите - неіснуюча втрата даних не повинна відбуватися
Антон

Це не допоможе, якщо віддалена система не буде rsyncлегко доступна .... (Як Win32-OpenSSH)
Герт ван ден Берг

@GertvandenBerg rsync досить просто встановити на Windows, не складніше, ніж SSH.
Жиль,

@Gilles: Правда, але всі параметри, мабуть, включають DLL-файли Cygwin ... (Поточний стан MS-порту OpenSSH такий, що включення компресії на scp достатньо, щоб зламати SCP ...) (Отримання функціоналу rsync за Win32 -OpenSSH також здається нетривіальним - сподіваємось, що з часом поліпшується) (Solaris 10 - інший приклад, коли необхідний пакет сторонніх постачальників --rsync-path)
Герт ван ден Берг,

82

scp замінить файли, якщо у вас є дозволи на запис.

Іншими словами: Ви можете scpефективно пропускати згадані файли, тимчасово видаляючи на них дозволи на запис (якщо ви власник файлів, тобто).


5
Дякую за це Був саме той трюк, який я шукав.
сахарин

переконайтеся, що ви скопіювали файли назад, ви додали * для цього. Прикладscp -r user@server.com:/location/of/files/* /local/location/
Рік

1
знайти. -тип f -exec chown root: root {} \;
лінг

1
У тому випадку, коли очікується, що лише деякі файли в каталозі будуть перезаписані (якщо вони не захищені), а дозволи файлів не є однаковими для файлів, це рішення може не працювати. В іншому випадку це досить просто і ефективно.
sancho.s

Для цього у вікні виберіть усі файли, клацніть правою кнопкою миші -> властивості -> лише для читання
BenJammin

12

Ви можете скопіювати лише нові файли за датою. Використовуйтеfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

що означає +7?
Френсіс Кім

@FrancisKim це означає, що змінено 7 днів тому. Тож у цьому запиті виберіть будь-які * .gz файли, змінені протягом останніх 7 днів
Вадим Єремеєв,

4
Чи не означає +7 насправді більше 7 днів тому?
Джефф Х.

1
Так, це означає "більше 7 днів тому". Не маю ідеї, хто це спровокував.
Стефан Рейх

9

Якщо ви можете зробити вміст цільового файлу лише для читання:

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

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

І змінити їх згодом ( chmod +wщоб отримати значення на основі umask). Якщо файли не мають дозволу на запис відповідно до вашого umask, вам доведеться якось зберігати дозволи, щоб ви могли їх відновити.

(Відповідь Гілла перезаписує існуючі файли, якщо локально вони новіші, я втратив цінні дані таким чином. Не розумію, чому за таку неправильну та шкідливу відповідь так багато голосів).


2
Я не розумію: як це rsync --ignore-existingпризвело до втрати даних?
Жиль

4
Я отримав помилку , find: missing argument to '-exec'використовуючи цю команду, а замість цього довелося використовувати: find . -type f -exec chmod a-w {} \;. Мій linux поганий, ymmv.
wpearse

Це краща і безпечніша відповідь. Правильна команда змінити дозвіл така, як згадується @wpearse:find . -type f -exec chmod a-w {} \;
Амір

6

У мене була схожа завдання, в моєму випадку я не міг використовувати 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

Щоб скопіювати цілу купу файлів, швидше їх націлити. Використовуючи -k, ви також запобігаєте перезапису файлів tar при розпакуванні його в цільовій системі.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
Воно робить віддалене з'єднання. По-перше, це tar є джерелом, передає його в ssh-з'єднання і розпаковує його на віддаленій системі.
huembi

-1

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

  1. Скопіюйте всі наявні файли

    mkdir original_files ; cp -r * original_files/
    
  2. Скопіюйте все за допомогою scp

    scp -r user@server:dir/* ./
    
  3. Скопіюйте оригінальні файли на все, на що написано scp:

    cp -r original_files/* ./
    

3
Цей метод не допомагає, коли ви намагаєтеся перетягнути файли з віддаленого пристрою та забрати місце, де ви зупинилися. Тобто, якщо вся мета - заощадити час.
Олівер Вільямс

-1

Інший спосіб досягти цього - це зробити в 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

Будь ласка, не робіть цього. 1. Не розбирайте ls . 2. Відповідь небезпечна, якщо будь-яке ім'я файлу містить - >пробіл у новому рядку чи інші спеціальні символи. 3. Жорсткий код для циклу for в python-скрипті. Створення програми під час виконання є складним і складним (навіть коли це робиться професійними програмістами) з багатьох причин. Створення сценарію оболонки ще гірше - жахлива ідея.
ignis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.