Как выполнить рекурсивную распаковку архива?

Пожалуйста, помогите с написанием скрипта для работы с zip-файлами. У меня есть структура из более чем 1000 папок, которая включает: 
- 2 основные папки (А1, А2)
- около 65-70 вложенных папок второго уровня (А11, А12, А21, А22 и др.)
- в каждой вложенной папке находится примерно 13-15 папок третьего уровня (А111, А112 и т.д.)

В каждой папке содержатся zip-архивы с различными именами. 

Мне необходимо рекурсивно распаковать все zip-архивы по всей структуре, используя цикл, так, чтобы в папках третьего уровня, содержащих архивы, не создавались новые папки. Все файлы и папки из архивов должны извлекаться непосредственно в эти папки.

Например, если в архиве находится папка "buh" и файл "buh.sig", то при распаковке результат должен выглядеть следующим образом:
- D:\A1\A11\A111\buh 
- D:\A1\A11\A111\buh.sig 

А не так:
- D:\A1\A11\A111\\buh 
- D:\A1\A11\A111\\buh.sig
  • 18 апреля 2025 г. 14:45
Ответы на вопрос 2
Для рекурсивной распаковки zip-файлов в указанной вами структуре, можно использовать язык Python и библиотеку `zipfile`. Вот пример скрипта, который выполняет данную задачу:

```python
import os
import zipfile

def unzip_recursively(directory):
    # Проходим по всем файлам и папкам в указанной директории
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.zip'):  # Проверяем, является ли файл zip-архивом
                zip_path = os.path.join(root, file)
                print(f'Распаковка: {zip_path}')
                
                # Создаем zip-файл
                with zipfile.ZipFile(zip_path, 'r') as zip_ref:
                    # Извлекаем все файлы в текущую директорию
                    zip_ref.extractall(root)
                
                # Опционально, если хотите удалить zip-файл после распаковки
                # os.remove(zip_path)

if __name__ == "__main__":
    directory_to_unzip = r'D:\A1'  # Укажите путь к вашей основной папке
    unzip_recursively(directory_to_unzip)
```

### Как использовать этот скрипт:

1. **Установите Python**: Убедитесь, что у вас установлен Python (рекомендуется версия 3.x).

2. **Скопируйте код**: Скопируйте приведенный выше код в текстовый файл и сохраните его с расширением `.py`, например, `unzip_recursively.py`.

3. **Обновите путь**: В строке `directory_to_unzip = r'D:\A1'` укажите путь к вашей основной папке, где начинается распаковка.

4. **Запустите скрипт**:
   - Откройте командную строку (cmd).
   - Перейдите в директорию, где вы сохранили скрипт.
   - Выполните команду `python unzip_recursively.py`.

### Как работает скрипт:

- Используется `os.walk`, чтобы рекурсивно обойти все папки и файлы в указанной директории.
- Проверяется, является ли каждый файл zip-архивом (проверка на расширение `.zip`).
- С помощью `zipfile.ZipFile` открывается архив и распаковывается содержимое непосредственно в ту же директорию, где находится архив.
- Опционально, вы можете раскомментировать строку `os.remove(zip_path)`, если хотите удалить zip-архив после его распаковки.

Этот скрипт должен соответствовать вашим требованиям и корректно распаковать все архивы в заданной структуре.
т.е. нужно просто рекурсивно зайти в каждый подкаталог, и для каждого zip файла выполнить unzip -x name.zip 

for /R %%F in (*.zip) do unzip x "%%F" -d "%%~dpF"
p.s. проверить не на чем, очень давно без windows и вообще не рекомендую писать сложные скрипты на bat, языку лет 30 уже наверное.. можно наверное на powershell но я не подскажу мне он еще меньше нравится.

в windows в поставке идет штатно полноенный .net и коппилятор c#/js#/vbs#, с адекватным синтаксисом.

а еще ранее, с windows идет windows scripting host, с поддержкой javscript/vbscript, который запускает скрипты прямо из текстового файла wscript //nologo myscript.js..

да в лоб код будет объемнее, но если тебе нужно работать с датами, проверять корректность распаковки или к примеру контролировать вывод архиватора (например были ли перезаписи файлов с теми же именами) то нормальный язык предпочтительнее
Похожие вопросы