Як відновити scp з частково скопійованими файлами? [зачинено]


97

Я використовую команду scp shell для копіювання величезної папки файлів.

Але в якийсь момент мені довелося вбити запущену команду (Ctrl + C або kill).

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

Як можна відновити одну і ту ж команду scp, щоб не перезаписати успішно скопійовані файли та правильно обробляти частково скопійовані файли?

PS Я знаю, що можу робити подібні речі у rsync, але scp для мене чомусь швидший, і я використовую їх замість цього.


4
Я підозрюю, що rsync повільніше, тому що витрачає додатковий час на виконання дій, які дозволяють вам перезапустити передачу. Ви можете просто використовувати rsync для завершення часткового перенесення.
Кіт Томпсон,

2
Якщо ви хочете бути кмітливим, ви завжди можете спробувати ddз відповідною skipзмінною і підійти до ssh:)
Mark Nunberg

1
Це поза темою для ТА. Він належить SuperUser, і там його справді запитували .
Дан Даскалеску,

Відповіді:


185

Ви повинні використовувати rsyncбільшеssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

Ключовий варіант - -Pце те саме, що--partial --progress

Також можуть бути використані інші параметри, такі як -a(для режиму архівування) та -z(для увімкнення стиснення).

Посібник: https://download.samba.org/pub/rsync/rsync.html


43
Просто хотів зазначити, що rsync відновить пакетну копію, розпочату з scp, просто чудово.
Крейг Андерсон

6
Ви отримаєте "пропуск каталогу". помилка, якщо ви також не вказали -r. Джерело: lucasb.eyer.be/snips/rsync-skipping-directory.html
Артур Чайка

4
Працював для мене, але я додав - додавати теж .... rsync -P - додавати -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd

1
@CraigAnderson - це важливий момент, який залишили поза увагою. Відповідь звучить так, нібито передбачає, що завантаження слід розпочати з rsync для початку.
Вілла

1
Наведені у відповіді варіанти не працювали для мене, але це було так:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Кролик зайчика

26

Альтернатива rsync:

Використовуйте sftpз опцією -r(рекурсивно копіювати цілі каталоги) та опцією -aкоманди sftp'', getщоб відновити часткову передачу існуючих файлів.

Необхідна умова: Ваша sftpреалізація має вже getз -aопцією.

Приклад:

Скопіюйте каталог /foo/barіз віддаленого сервера у ваш поточний локальний каталог. Каталог barбуде створений у вашому поточному локальному каталозі.

echo "get -a /foo/bar" | sftp -r server

4
Ваше рішення є чудовим, оскільки мій сервер не дозволяє входити в ssh, тому rsync не працює. Мені потрібно було завантажити замість завантаження, тому ось моя команда:echo "put -a foo/bar" | sftp -r server:/foo
Карлос Рафаель Рамірес

1
Це здається набагато життєздатним варіантом відновлення частково завантажених файлів, оскільки rsync, здається, не дуже зручний для ssh (з портами, що не використовуються за замовчуванням).
codezombie

11

Оскільки OpenSSH 6.3, ви можете використовувати regetкоманду в sftp.

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


6

Інша можливість - спробувати врятувати скрап, який ви вже почали, коли він забуває.

ctrl + z у фоновому режимі та зупиніть його, потім ssh перейдіть на сервер-одержувач та ввійдіть, а потім вийдіть. Тепер fg процес scp і подивіться, як він відновлюється з "зупинився"!


Працював у мене на Mac OS X. Дякую, що опублікував це, це сьогодні врятувало мій бекон!
Бен Хічкок

1

Коли rsync також зупиняється через кілька секунд, коли спочатку працював нормально, я отримав таке рішення грубої сили:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done

1

Ви можете використовувати -rshі -Pваріанти rsync. -Pпризначений для часткового завантаження та -rshозначає, що передача закінчується через ssh procotol.

Повною командою буде: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path


-5

У мене вчора був такий самий випуск, що передав величезний скид sql через scp, мені пощастило wget --continue the_url

Ця публікація в блозі це досить добре пояснює http://www.cyberciti.biz/tips/wget-resume-broken-download.html


Найкращою практикою вважається копіювання відповідних частин із URL-адреси у відповідь, якщо сайт знижується.
Ryre

Я намагаюся завантажити, тому для мене немає wget.
Рольф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.