У меня есть 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
Эти 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).
Сценарий записанный рев извлекает 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
В Вашем случае попробуйте в целевой папке:
ln -s Release . && unzip <YourArchive>.zip
Чем Вы должен удалить ссылку, которую Вы создали:
rm Release