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


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/* .
Джордж Удосен

@George це все ще створює 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).

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.