10

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

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

6 ответов6

4

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

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

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

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

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 и принудительно перепроверил, и мне не хватало только процента, которого у меня действительно не было, то есть битторрент-клиент определил, что у меня есть истинная информация между всеми нулями, которые я добавлено.

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

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

1

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

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

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

Прибыль!

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

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 до 32k, тогда, возможно, tail -c +$misalignment lastpart/file | dd ... of=p1/file conv=notrunc bs=32k seek=$(( (full_size - lastpart_size + misalignment) / (32 * 1024) ))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .