7

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

1 ответ1

9

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


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

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