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 Release
sans créer un dossier Release
, comme ceci:
/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
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
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).
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)
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