Üst dizin oluşturmadan belirli dizinin sıkıştırmasını aç


12

İçinde tüm dosyaların depolandığı bir üst dizin olduğu bir ZIP dosyası var:

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

ReleaseDizin yapısını koruyarak altında her şeyi ayıklamak istiyorum , ama bunu çalıştırdığımda:

unzip archive.zip Release/* -d /tmp

En üst Releaseklasörü oluşturur :

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

Nasıl her şey içini çıkarabilir Release olmadan bir oluştururken Releaseböyle klasörü:

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

unzip archive.zip && mv Release/* .
Şunu

@George bu hala bir Releaseklasör oluşturuyor
jsta

Yanıtlar:


6

Sizin durumunuzda, hedef klasörde deneyin:

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

Oluşturduğunuz bağlantıyı kaldırmanız gerekenden:

rm Release

3

jBayrak klasör oluşturma engellemelidirunzip -j archive.zip -d .

Gönderen adam sayfası :

-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
Bence bu yakın, ama OP sadece üst düzey dizinin oluşturulmasını atlamak ve kalan dizin yapısını korumak arıyordu. -jopsiyon arşivinde dizin yapısına bakılmaksızın geçerli dizine tüm dosyaları döker.
Charles Green

1

Çıkarılan ağacı düzleştirmek için Python betiği

Feryat yazılı komut dosyası zip dosyasını ayıklar ve en üstteki dizinde bulunan dosyaları geçerli çalışma dizinine taşır. Bu hızlı komut dosyası, tüm dosyaları içeren tek bir en üstteki dizinin olduğu bu özel soruya uyacak şekilde uyarlanmıştır, ancak birkaç düzenleme ile daha genel durumlar için uygun hale getirilebilir.

#!/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)

Test sürüşü

İşte betiğin nasıl çalışacağına dair bir örnek. Her şey geçerli çalışma dizinine ayıklanır, ancak kaynak dosya tamamen farklı dizinde olabilir. Test, kişisel github veri havuzumun zip arşivinde gerçekleştirilir.

$ 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

Kaynak dosya farklı konumdayken test edin

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.