Извлечь содержимое папки из архива 7z в определенную папку

641
Matteo Tassinari

У меня есть архивный файл 7z, который на уровне «root» содержит пару файлов, а затем каталог, который, в свою очередь, содержит файлы и папки, например:

- file1.txt - file2.txt - my_dir - file3.txt - file4.txt - another_dir - file5.txt - file6.txt 

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

- target_dir - file3.txt - file4.txt - another_dir - file5.txt - file6.txt 

Я пробовал эти команды:

7za x -y archive.7z -o/path/to/target_dir my_dir 7za x -y archive.7z -o/path/to/target_dir 'my_dir/*' 

но оба создали эту структуру каталогов:

- target_dir - my_dir - file3.txt - file4.txt - another_dir - file5.txt - file6.txt 
7
Работает ли это: `7z x archive.7z my_dir -y -r -otarget_dir`? harrymc 6 лет назад 0
К сожалению, нет, тот же результат, что и команды, которые я пробовал. Matteo Tassinari 6 лет назад 0
Затем извлеките его и двигайтесь. harrymc 6 лет назад 0

1 ответ на вопрос

8
DavidPostill

Есть ли одна команда, которая позволяет извлечь my_dir в указанный каталог?

Да. Используйте eопцию вместо x:

7za e -y archive.7z -o/path/to/target_dir my_dir 

( xэто экстракт с полными путями )

Команда e (Извлечь)

Извлекает файлы из архива в текущий каталог или в выходной каталог. Выходной каталог может быть указан ключом -o (Задать выходной каталог).

Эта команда копирует все извлеченные файлы в один каталог. Если вы хотите извлечь файлы с полными путями, вы должны использовать команду x (Извлечь с полными путями).

Команда Source e (Extract)


Но на самом деле папка в архиве содержит подпапки, которые я хотел бы сохранить

В этом случае вам нужно использовать исходную команду (с x), а затем использовать moveдля перемещения содержимого my_dirна уровень выше.

Что-то вроде следующего командного файла (не проверено):

@echo off 7za x -y archive.7z -o/path/to/target_dir my_dir move /y my_dir\* /path/to/target_dir rd /s my_dir endlocal 

Из командной строки:

7za x -y archive.7z -o/path/to/target_dir my_dir && move /y my_dir\* /path/to/target_dir && rd /s my_dir 

Но я использую Linux!

Тогда команды для использования:

#!/bin/bash 7za x -y archive.7z -o/path/to/target_dir my_dir mv -f my_dir/* /path/to/target_dir rmdir my_dir 

Или же:

7za x -y archive.7z -o/path/to/target_dir my_dir && mv -f my_dir/* /path/to/target_dir && rmdir my_dir 

Что, вероятно, может быть упрощено кем-то, кто знает bashлучше меня.


Дальнейшее чтение

Привет, Дэвид, спасибо за твою помощь, но я боюсь, что я, возможно, слишком упростил мой вопрос, на самом деле папка в архиве содержит подпапки, которые я хотел бы сохранить, см. Редактирование. Matteo Tassinari 6 лет назад 0
@MatteoTassinari Тогда вам нужно будет использовать исходную опцию `x`, а затем использовать` move`, чтобы переместить содержимое `my_dir` на уровень выше. DavidPostill 6 лет назад 0
Вот чего я боялся, я очень надеялся, что это можно сделать за одну команду Matteo Tassinari 6 лет назад 0
@MatteoTassinari Ответ обновлен предложенным командным файлом. DavidPostill 6 лет назад 0
Спасибо за сценарий, однако моя ОС - CentOS, а не Windows, поэтому я поставил вопрос «linux». У меня не будет проблем с преобразованием этого в эквивалент Linux, хотя. Matteo Tassinari 6 лет назад 0
@MatteoTassinari Ответ обновлен для покрытия с использованием `bash`. DavidPostill 6 лет назад 0

Похожие вопросы