Décompressez un répertoire spécifique sans créer de répertoire supérieur

12

J'ai un fichier ZIP dans lequel il y a un répertoire supérieur où tous les fichiers sont stockés:

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

Je veux extraire tout sous Release, en préservant la structure du répertoire, mais quand je lance ceci:

unzip archive.zip Release/* -d /tmp

Il crée le Releasedossier supérieur :

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

Comment puis-je tout extraire à l'intérieur Release sans créer de Releasedossier, comme ceci:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
Moïse
la source
Essayez ceciunzip archive.zip && mv Release/* .
George Udosen
@George cela crée toujours un Releasedossier
jsta

Réponses:

5

Dans votre cas, essayez dans le dossier cible:

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

Ensuite, vous devez supprimer le lien que vous avez créé:

rm Release
arche
la source
3

Le jdrapeau devrait empêcher la création de dossiersunzip -j archive.zip -d .

Depuis la page de manuel :

-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
la source
9
Je pense que c'est proche, mais l'OP cherchait à ne sauter que la création du répertoire de niveau supérieur et à préserver la structure de répertoire restante. l' -joption vide tous les fichiers dans le répertoire courant sans tenir compte de la structure du répertoire dans l'archive.
Charles Green
1

Script Python pour aplatir l'arbre extrait

Le script écrit ci-dessous extrait le fichier zip et déplace les fichiers contenus dans le répertoire le plus haut vers le répertoire de travail actuel. Ce script rapide est conçu pour répondre à cette question particulière où il existe un seul répertoire supérieur contenant tous les fichiers, bien qu'avec quelques modifications, il puisse être adapté à des cas plus généraux.

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

Essai

Voici un exemple de la façon dont le script est censé fonctionner. Tout est extrait dans le répertoire de travail actuel, mais le fichier source peut être complètement dans le répertoire différent. Le test est effectué sur l'archive zip de mon référentiel github personnel.

$ 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

Testez avec le fichier source dans un emplacement différent

$ 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
Sergiy Kolodyazhnyy
la source