Как распаковать несколько ZIP-файлов в единую структуру каталогов (например, экспорт папки Google Диска)

Как распаковать несколько ZIP-файлов в единую структуру каталогов (например, экспорт папки Google Диска)

Предположим, вы начали с несжатого каталога Aсо следующей структурой:

$ tree A
A
└── inner_dir
    ├── file1.txt
    └── file2.txt

1 directory, 2 files

Теперь предположим, что вам дали два zip-файла 1.zip, и 2.zipодин из них Aсодержит 1.zipтолько один file1.txt, а другой 2.zipсодержит только один file2.txt:

# -l flag simply lists file contents

$ unzip -l 1.zip 
Archive:  1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-09-30 21:49   A/
        0  2017-09-30 22:27   A/inner_dir/
        0  2017-09-30 21:49   A/inner_dir/file1.txt
---------                     -------
        0                     3 files

$ unzip -l 2.zip 
Archive:  2.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-09-30 21:49   A/
        0  2017-09-30 22:27   A/inner_dir/
        0  2017-09-30 22:27   A/inner_dir/file2.txt
---------                     -------
        0                     3 files

Какую команду можно использовать для программного восстановления исходного разархивированного каталога Aиз комбинации 1.zipи 2.zip?

Контекст:при экспорте большого каталога из Google Drive содержимое разбивается на набор из 2 или более zip-файлов. Каждый zip-файл содержит некоторое подмножество файлов, которые, взятые вместе, воссоздают исходный каталог. Какие файлы содержатся в каком zip-файле, кажется более или менее случайным. Я ищу решение, которое обобщает n > 1 zip-файлов, а не только частный случай ровно 2 файлов.

решение1

Переместите набор файлов, которые вы хотите распаковать, в отдельный каталог, а затем используйте unzip:

$ unzip '*.zip' -d combined

Archive:  1.zip
   creating: combined/A/
   creating: combined/A/inner_dir/
 extracting: combined/A/inner_dir/file1.txt  

Archive:  2.zip
 extracting: combined/A/inner_dir/file2.txt  

2 archives were successfully processed.

Проверять:

$ tree combined
combined
└── A
    └── inner_dir
        ├── file1.txt
        └── file2.txt

2 directories, 2 files

решение2

@lcharbon ваша проблема в том, как zip обрабатывает нестандартную кодировку.

Эту проблему можно решить с помощью p7zip, который справляется с этим лучше.

Вот аналоговая команда с использованием p7zip:

7z x '*.zip' -ocombined

Вы можете установить p7zip на Mac с помощью brew brew install p7zipили менеджеров пакетов вашего дистрибутива на Linux.

Связанный контент