web-dev-qa-db-fra.com

Décompressez un répertoire spécifique sans créer le répertoire principal

J'ai un fichier Zip dans lequel se trouve un répertoire principal où sont stockés tous les fichiers:

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

Je veux tout extraire sous Release, en préservant la structure de répertoires, mais lorsque je lance ceci:

unzip archive.Zip Release/* -d /tmp

Il crée le dossier Release en haut:

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

Comment puis-je extraire tout ce qui se trouve à l'intérieur de Releasesans créer un dossier Release, comme ceci:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
10
Moses

Dans votre cas, essayez dans le dossier cible:

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

Alors vous devez supprimer le lien que vous avez créé:

rm Release
3
ark

L'indicateur j devrait empêcher la création du dossier unzip -j archive.Zip -d .

De 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).
2
jsta

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 élevé en dehors du répertoire de travail en cours. 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 que quelques modifications permettent de l’adapter à 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 ce qui est extrait dans le répertoire de travail actuel, mais le fichier source peut être dans un 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

Test avec le fichier source se trouvant à 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
1