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

12

У меня есть 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 без создания Releaseпапки, например так:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
Моисей
источник
Попробуйте этоunzip archive.zip && mv Release/* .
Джордж Удосен
@ Джордж это все еще создает Releaseпапку
Jsta

Ответы:

5

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

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

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

rm Release
ковчег
источник
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).
jsta
источник
9
Я думаю, что это близко, но ОП хотел только пропустить создание каталога верхнего уровня и сохранить оставшуюся структуру каталога. -jопция сбрасывает все файлы в текущем каталоге без учета структуры каталогов в архиве.
Чарльз Грин
1

Скрипт 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)

Тестовый забег

Вот пример того, как скрипт должен работать. Все извлечено в текущий рабочий каталог, но исходный файл может быть в другом каталоге. Тест проводится на 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
Сергей Колодяжный
источник