Як відновити 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.