Как извлечь multipart rar с отсутствующими частями?


12

У меня есть многокомпонентный .rarархив, содержащий один .tar.gzфайл внутри него (не спрашивайте почему, именно так оно и было сделано). Мне не хватает нескольких частей, но есть первая часть. Я хотел бы извлечь как можно больше из этого .tar.gz. Как я могу это сделать?

Если я запускаю unrar x -kb file.part1.rarего всегда извлекает начало .tar.gzиз part1и останавливается там с ошибкой. Я счастлив попробовать любые инструменты (не должен быть unrar).


1
очевидно, вам нужно все это, иначе не получится
— Sickest

1
Ну, он говорит, что хочет "как можно больше". Тем не менее, весьма вероятно, что все, что он извлекает, не будет пригодно для использования, если только это не простой формат файла (растровое изображение?).
— WindowsEscapist

Если внутри есть другой архив, который содержит много файлов, он может восстановить некоторые файлы. Хитрость заключается в том, чтобы просто извлечь WinRar как можно больше.
— Давидбауман

2
Я не понимаю, почему люди отказываются от вопросов, просто потому, что они не понимают.
— Давидбауман

Итак, вы нашли решение и поделились с нами?
— Давидбауман

Ответы:


2

У меня была похожая вещь на окнах , когда у меня были части 1,5,6,9,10 из 10. Мне не хватало частей 2,3,4,7,8.

  1. используйте 7zip для извлечения частей, которые у вас есть, и соответственно переименуйте их. то есть: pt1, pt5, pt6 и т. д.

  2. сгенерируйте нулевой (нулевой) файл, чтобы заполнить недостающие части, используя точный размер в байтах каждой из частей, которые вы ДЕЛАЕТЕ и извлекли (т.е. размер pt1, который равен размеру pt5 и pt6 ...):

    fsutil файл createnew [path_to_file] [size_in_bytes]

    в моем случае я использовал:

    fsutil файл createnew C: \ TMP \ empty 1022701562

  3. объединить файлы (используя / b для двоичных файлов)

    скопировать / b file1 + file2 + file3 targetfile

    в моем случае:

    copy / b pt1 + empty + empty + empty + pt5 + pt6 + empty + empty + pt9 + pt10 output_file

когда это было сделано, я загрузил файл в битторрент-клиент Deluge и принудительно перепроверил, и мне не хватало только процента, которого у меня действительно не было, то есть битторрент-клиент определил, что у меня есть истинная информация между всеми нулями, которые я добавлено.


Я не очень хорошо понимаю инструкции. Как «извлечь нужные детали» из 7zip? 7z %fileпытается загрузить все файлы деталей и возвращает ошибку, если один из них уже отсутствует. Какое отношение все это имеет к торрентам? Могу ли я извлечь отдельные оригинальные сжатые файлы из сцепленного двоичного файла с помощью Deluge?
— cduguet

5

Возможно, это больше не актуально, но у меня возникла та же проблема, и я нашел простое решение, которое сработало для меня, и подумал, что было бы неплохо поделиться.

У меня был защищенный паролем архив RAR в 6 частях, но часть 4 отсутствовала. Я пытался использовать функцию восстановления WinRAR, но он сказал, что не может найти запись восстановления. Я попробовал описанные выше методы, но они не работали, и извлечение всегда останавливалось там, где начиналась недостающая часть.

Наконец, я решил обмануть WinRAR в части мышления 5 и 6, где был другой архив, и переименовал их в «archive.part1.rar» и «archive.part2.rar». Затем я сказал WinRAR извлечь новую часть 1, и хотя я получил сообщение об ошибке, в котором говорилось, что он не может извлечь файл, который закончился в начале новой части 1 (так как в нем отсутствовали некоторые данные из отсутствующей части 4), ему удалось извлечь все остальные файлы из оригинальных частей 5 и 6.

Я надеюсь, что это поможет другим людям с той же проблемой в будущем.


1

Я предполагаю, что 100Mb частей, часть 3 отсутствует. Можешь попробовать

cat blubb.part01.rar blubb.part02.rar blubb.part04.rar > blubb.rar

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

dd if=/dev/zero of=blubb.part03.rar bs=1M count=100
cat blubb.part01.rar blubb.part02.rar blubb.part03.rar blubb.part04.rar > blubb.rar

Хорошие идеи, опробовали их. 1. Если все существующие части объединены, происходит сбой unrar (ошибка CRC) в том же месте. 2. Если я просто скопирую более позднюю часть, чтобы иметь то же имя, что и у отсутствующей части, она не будет выполнена в том же месте, но затем напечатает сообщения, которые подразумевают, что она обрабатывает более поздние части (возможно, ищет начало другого файла) 3. Если я создаю файл с нулями с помощью dd, он завершается неудачно с «Плохой архив»
— Alex I

И, если я создаю файл со всеми нулями и объединяю, он завершается с ошибкой в ​​одном месте с «Не удается найти том»
— Alex I

Просто мышление: cat blubb.rar | unrar > file.tgz.
— Давидбауман

Может быть, вы хотите использовать WinRar для Windows
— davidbaumann

1

Шаг 1: переименуйте файлы, например:

file.part1.rar -> fileA.rar
file.part2.rar -> fileB.rar
file.part3.rar -> fileC.rar
etc..

Шаг 2: Используйте 7-Zip для извлечения каждого файла.

Прибыль!

(В некоторых случаях переименование не требуется, и вы можете позволить 7-Zip извлечь все файлы для вас.)


3
Это не поможет с файлами, которые охватывают более одного файла детали.
— Рохит Гупта

Вы пытались извлечь каждый переименованный файл один за другим, используя 7-Zip?
— cychoi

1

У меня была только вторая часть из двух частей rar архива, при распаковке части 2, как и ожидалось, winrar высветил сообщение о том, что первая часть отсутствует; Я также заметил, что все содержимое второй части было распаковано в папке; поэтому, не касаясь всплывающего сообщения winrar, я скопировал распакованные файлы в другую папку, а затем нажал кнопку «Закрыть» во всплывающем сообщении winrar; распакованное содержимое было удалено winrar, но поскольку я ранее скопировал их в другую папку, я мог использовать распакованное содержимое из этой другой папки.


0

7-zip извлечет часть файла из rar, состоящего из нескольких частей, и затем вы сможете сшить их обратно вместе с dd. Например, если у вас есть первая и последняя rar-части:

7z x p1.rar
mv dir p1  # rename out of the way
7z x plast.rar
unrar l p1.rar
   # note the file size of the entire file
ls -l dir/file  # note the size of the last part
dd if=dir/file of=p1/file  conv=notrunc  bs=1 seek=$((full_size - lastpart_size))

Если смещение, к которому нужно стремиться, не является простым, используйте размер блока больше единицы. ddможно только seekумножить на размер выходного блока. ddдействительно делают readи writeсистемные вызовы с этим размером блока, так что на bs=1самом деле отстой.

Большой ibs(размер входного блока) сэкономит половину процессорного времени, так как seekвыражается в единицах obs(размер выходного блока). Или, может быть, есть какой-то другой инструмент, который может искать произвольную позицию байта, а затем выполнять операции ввода-вывода нормального размера. Или, если вы пишете это, вы можете использовать dd с bs=1выравниванием до 32 Кб, тогда, возможно,tail -c +$misalignment lastpart/file | dd ... of=p1/file conv=notrunc bs=32k seek=$(( (full_size - lastpart_size + misalignment) / (32 * 1024) ))

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.