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

У меня есть архивный файл 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

2 ответа

Решение

Есть ли одна команда, которая позволяет извлечь 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 лучше чем я


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

Управление несколькими архивами

Не уверен, что это было возможно, когда вопрос был задан впервые, но есть более простое решение, которое работает с обоими и (сохраняет структуру папок,eсглаживает все, поэтому тот, который вы ищете:):

7z x archive.7z -opath/to/dir

Оба переключателя (здесь,xи-o) поддержка подстановочных знаков:

7z x *.7z -o*

Это приведет к извлечению всех архивов .7z из текущего каталога в новые подкаталоги с тем же именем.

Источник: переключатель -o (установить выходной каталог)

Фильтрация только для извлечения папок

Если известны типы файлов, подлежащие фильтрации, например.txtв вашем примере,7z x archive.7z -opath/to/dir -x!*.txtсделает свое дело. Альтернативно вы можете отфильтровать все имена, содержащие точку (), чтобы исключить все файлы:7z x archive.7z -opath/to/dir -x!*.*. Обратите внимание, что это также отфильтрует любую папку, содержащую точку (.) от своего имени

Другие вопросы по тегам