Извлечение конкретного файла из архива с помощью 7-Zip

Вопрос или проблема

Я запускаю Linux Live CD и мне нужно извлечь определенный файл из wim-архива, который находится на жестком диске. Я знаю полный путь к файлу в архиве:

xubuntu@xubuntu:~$ 7z l winRE.wim | grep -i bootrec.exe
2009-08-28 15:02:29 ....A       299008       134388  Windows/System32/BootRec.exe

У меня мало места на диске, и нет возможности распаковать весь архив.

Как я могу извлечь этот конкретный файл из архива?

Я пробовал опцию -i, но это не сработало:

xubuntu@xubuntu:~$ 7z x -i Windows/System32/BootRec.exe winRE.wim 

Ошибка:
Неверная командная строка

Страница man 7z говорит:

  -i[r[-|0]]{@listfile|!wildcard}
         Включить имена файлов

Вам нужно явно указать ! перед именем файла и защитить переключатель от расширения bash с помощью одиночных кавычек: 7z x '-i!Windows/System32/BootRec.exe' winRE.wim

xubuntu@xubuntu:~$ 7z x '-i!Windows/System32/BootRec.exe' winRE.wim

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,4 CPUs)

Обработка архива: winRE.wim

Извлечение Windows/System32/BootRec.exe

Все в порядке

Размер:       299008
Сжатый: 227817568

(Вы можете избежать сохранения полного пути, используя букву функции e: 7z e '-i!Windows/System32/BootRec.exe' winRE.wim.)

Кстати, если вы не защитите опцию -i одиночными кавычками или защитите ее двойными кавычками, вы получите ошибку:

xubuntu@xubuntu:~$ 7z x "-i!Windows/System32/BootRec.exe" winRE.wim 
bash: !Windows/System32/BootRec.exe: событие не найдено
7z e [имя архива] -o[направление вывода] [имя файла]

например:

7z e 'Movies.rar' -o"/root/Un archived/" 'Rush.mp4'

Эта команда сработала для меня, я пробовал ее на ubuntu server 16.04.

Сработало для меня (возможно, вам захочется использовать прямые слэши вместо этого, см. ниже):
7z e -so 'file.zip' 'file\path\file.png' > 'file.png'
(Один PNG-файл извлечен из ZIP-файла: команда создаст или ПЕРЕЗАПИШЕТ любой файл с именем “file.png” в текущем каталоге. e: извлечь, сохраняя имя файла, но не сохраняя путь файла. -so: вывод в stdout.)

НЕ сработало для меня:

7z e 'file.zip' 'file.png' -r
7z e 'file.zip' -o. 'file.png' -r
7z e 'file.zip' -o'.' 'file.png' -r
7z e '-i!file.png' 'file.zip'
7z e '-i!file/path/file.png' 'file.zip'
7z e '-i!/file/path/file.png' 'file.zip'

Почему эти команды не сработали для меня, а та команда сработала? Может быть, потому что разделители папок в путях файлов в ZIP-файле были обратными слэшами вместо обычных прямых слэшей. Возможно, я должен был запустить эти команды с обратными слэшами (\) или экранированными обратными слэшами (\\), тогда это бы сработало.

Если у вас есть ZIP-файл с не рекомендуемыми обратными слэшами (https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT §4.4.17.1) в путях файлов, вы также можете извлечь отдельный файл из него с помощью следующей команды unzip:
unzip -p file.zip 'path\\to\\file.png'

(Кредит: https://archived.moe/g/thread/85892819#85900314)

Ответ или решение

Вопрос об извлечении определенного файла из архива с помощью 7-Zip часто возникает среди пользователей, особенно в условиях ограниченного дискового пространства. Ваша ситуация предполагает использование Live CD Linux для извлечения файла BootRec.exe из WIM-архива winRE.wim. Давайте рассмотрим, как это можно сделать эффективно и правильно.

Теория

7-Zip — это мощное средство для работы с архивами, поддерживающее множество форматов, включая WIM. Для извлечения конкретного файла из архива необходимо правильно использовать параметры командной строки. Важный параметр -i позволяет включать определенные файлы при извлечении, но его следует корректно применять, чтобы избежать ошибок.

Пример

Ваш предыдущий подход через 7z x -i не сработал из-за неправильного синтаксиса. Согласно документации, для указания конкретного файла необходимо перед его путем добавить ! и использовать одиночные кавычки для защиты от расширения Bash. Таким образом, команда должна выглядеть следующим образом:

7z x '-i!Windows/System32/BootRec.exe' winRE.wim

Эта команда указывает на то, что 7-Zip должен извлечь только файл с указанным путем в архиве. Если вы хотите избежать включения полного пути, можно использовать команду e вместо x, которая извлекает файлы без сохранения иерархии директорий:

7z e '-i!Windows/System32/BootRec.exe' winRE.wim

Применение

Вам необходимо применить правильный синтаксис командной строки, чтобы избежать ошибок, которые могут возникнуть, когда Bash пытается интерпретировать специальные символы, такие как !. Убедитесь в использовании одиночных кавычек для защиты пути и включения знака ! перед путем к файлу. Это действие гарантирует правильную работу команды в условиях ограниченного дискового пространства, поскольку позволяет извлечь только необходимый файл, не распаковывая содержимое всего архива.

Если по какой-то причине архив содержит обратные слэши вместо прямых, можно попробовать альтернативные подходы, например, через команды unzip, корректно указав путь с обратными слэшами, либо адаптируя команды 7-Zip для корректной интерпретации путей в архиве.

Следуя вышеописанным рекомендациям, вы сможете эффективно управлять извлечением файлов из архивов даже в ограниченных условиях среды Linux Live CD.

Оцените материал
Добавить комментарий

Капча загружается...