Извлечь содержимое папки из архива 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!*.*
. Обратите внимание, что это также отфильтрует любую папку, содержащую точку (.
) от своего имени