Вопрос или проблема
Я запускаю 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'
Ответ или решение
Вопрос об извлечении определенного файла из архива с помощью 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.