Чи є спосіб відновити перерваний файл файлу?


12

Я час від часу завантажую дуже великий файл через scp, і є невеликий шанс кожного разу, коли з'єднання перестане і скоротити передачу в середині шляху.

Чи є спосіб відновити його?

Відповіді:


9

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

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Можлива оптимізація: робота з великими блоками. Залишимо це як домашнє завдання.


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

Я просто перевірив це, працює чудово, дякую!
Коссак

@Kossak, приємно чути!
yrk

ddз невеликими блоковими розмірами може бути повільним (тут всього 350 кБ / с). На щастя, scpпередачі здаються в 1024 байтових блоках. Якщо це так для файлу (або ж, шляхом усічення його до найближчого 1024 байт блоку), ви можете прискорити його , як це: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Зверніть увагу, що $sofarтоді для пропуску має бути кількість 1024 байтових блоків!)
tanius

2
Мені знадобилося певний час, щоб зрозуміти, що rsysу другому рядку є лише приклад імені хоста, а не якийсь спеціальний аргумент ssh. Я пропоную вам замінити його, user@hostщоб уникнути плутанини.
Ахмед Ессам

7

З scp, ні.

Якщо вони мають обидва кінці, ви можете використовувати rsync -LvzP remoteserver:path/to/file localfileдля передачі одного файлу.


Це врятувало мені години завантаження величезного файлу, який перервався. Дякую.
phette23

3

Так, є способи відновлення з точки перерви, але це неможливо за допомогою scp. sftp reget filenameробить те, що потрібно. Yarek та Grawity запропонували правильні рішення, які я поставив +1 обом, але для відновлення з точки перерви мені подобається rsync. Наведені приклади команд припускають, що ви завантажуєте файл з віддаленого сервера на локальну робочу станцію (завантажуєте). Майте на увазі, що останніми двома параметрами слід вважати source_file та target_file у цьому порядку. Синтаксис імені файлу змінюється залежно від того, є вихідний або цільовий файл локальним чи віддаленим. Якщо я надсилаю (завантажую) [текстові] файли, я б переписав приклади, наведені як:

# Від локального до віддаленого
sofar = `ssh remote_system ls -l interrupted_file | awk '{print $ 5}' `;
dd, якщо = source_file bs = 1 пропустити = $ sofar | ssh remote_system "кішка >> ./interrupt_file"

І до рішення rsync я додаю -e ssh. Ви повинні врахувати, чи потрібні багатослів’я, стиснення, збереження права власності, дозволів, часової позначки, повторних каталогів тощо. Перевірте основні сторінки та google стосовно параметра -L. Можливо, ви хочете, щоб символьні посилання залишалися як посилання замість посилання на них.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file


1

Там інше рішення (крім rsyncабо ddрішення , зазначені тут) , які я здивований , що ніхто не згадав: це reputкоманда sftp.


0
scp -o ConnectTimeout 60

Дозволяє вказати час очікування з'єднання. Може запобігти розриву вашого зв’язку.


0

Так, якщо обидва кінці підтримують sftp - після scp remoteuser@remotehost:/absolute/filename .невдачі ви можете відновити роботу, sftp remoteuser@remotehostа потім reget /absolute/filenameвідновити завантаження.

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