Разархивируйте определенный каталог, не создавая главный каталог

У меня есть zip-файл, в котором существует главный каталог, где все файлы хранятся:

Release/
Release/file
Release/subdirectory/file
Release/subdirectory/file2
Release/subdirectory/file3

Я хочу извлечь все под Release, сохранение структуры каталогов, но когда я выполняю это:

unzip archive.zip Release/* -d /tmp

Это создает вершину Release папка:

/tmp/Release/
/tmp/Release/file
/tmp/Release/subdirectory/file
/tmp/Release/subdirectory/file2
/tmp/Release/subdirectory/file3

Как я могу извлечь все внутри Release не создавая a Release папка, как это:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
11
задан 11 March 2017 в 13:44

3 ответа

Эти j флаг должен предотвратить создание папки unzip -j archive.zip -d .

От страница справочника :

-j 

junk paths. The archive's directory structure is not recreated; 
all files are deposited in the extraction directory (by default, the
current one).
2
ответ дан 23 November 2019 в 04:08

Сценарий Python для выравнивания извлеченного дерева

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

#!/usr/bin/env python3
import sys
import os
from zipfile import PyZipFile
for zip_file in sys.argv[1:]:
    pzf = PyZipFile(zip_file)
    namelist=pzf.namelist()
    top_dir = namelist[0]
    pzf.extractall(members=namelist[1:])
    for item in namelist[1:]:
        rename_args = [item,os.path.basename(item)]
        print(rename_args)
        os.rename(*rename_args)
    os.rmdir(top_dir)

Тестовый прогон

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

$ ls                                                                                   
flatten_zip.py*  master.zip
$ ./flatten_zip.py master.zip                                                          
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
flatten_zip.py*  LICENSE  master.zip  utc_indicator.png  utc-time-indicator

Тест с исходным файлом, находящимся в другом месте

$ mkdir test_unzip
$ cd test_unzip
$ ../flatten_zip.py  ../master.zip                                                     
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
LICENSE  utc_indicator.png  utc-time-indicator
1
ответ дан 23 November 2019 в 04:08

В Вашем случае попробуйте в целевой папке:

ln -s Release . && unzip <YourArchive>.zip

Чем Вы должен удалить ссылку, которую Вы создали:

rm Release
5
ответ дан 23 November 2019 в 04:08

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

Похожие вопросы: