Selon la façon dont un fichier zip est créé, il extrait parfois tous les fichiers directement et parfois il extrait les fichiers dans un sous-répertoire.
Si ce dernier est vrai, comment puis-je forcer la unzip
commande à "ignorer" ce répertoire de premier niveau?
Exemple:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
Ce que je reçois c'est /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
Ce que je veux, c'est des fichiers extraits /tmp/omeka/
, (un niveau supérieur et aucun numéro de version inclus dans la structure du répertoire)
/tmp/omeka/(files)
Je sais que je peux utiliser l' -j
option de "chemins indésirables" mais je veux conserver la structure du sous-répertoire, mais pas la structure du répertoire de niveau supérieur. Comment puis-je faire ceci?
mv
les fichiers, mais je voulais voir s'il y avait un moyen de le faire directement à partir de la commande de décompression/wordpress/
répertoire (pas de numéro de version) à l'intérieur du fichier zip. C'est bienunzip
ainsi,mv
mais le fait de ne pas avoir le contrôle de cela et de le faire en deux étapes m'a toujours un peu énervé. Heureusement, Wordpress est également disponible en version.tar.gz
:)cd /tmp/omeka && ln -s -T . omeka-1.5.1
Réponses:
Utilisez un système de fichiers FUSE qui vous permet de parcourir des archives comme des répertoires, tels que AVFS . Utilisez
cp
pour extraire les fichiers dans le répertoire de votre choix.Puisque nous supposons qu'il existe un seul répertoire de haut niveau dans l'archive, vous pouvez le raccourcir en
la source
unzip
avoir un peu de magie pour le faire, comme spécifier les fichiers à extraire comme*/*
, que je pourrais utiliser sans installer un autre utilitaire, mais je suppose que non. Merci. +1Si votre fichier zip ne contient pas de structure de répertoire ou si vous n'avez pas besoin de le conserver, vous pouvez utiliser ceci:
la source
Ce script n'est pas robuste, mais fonctionne dans les cas simples:
Il vérifie simplement s'il y a exactement un sous-répertoire, et si c'est le cas, en déplace tout, puis le supprime.
la source
Je viens de m'inscrire aujourd'hui, je ne peux donc pas voter pour @SteveBennet et je ne peux pas y ajouter de commentaire.
Sur la base de sa réponse, j'ai créé une fonction récursive comme celle-ci:
Tout comme @SteveBennet l'a dit: ce script n'est pas robuste, mais fonctionne dans les cas simples.
J'espère que c'est utile.
la source
Besoin ressemble à une
patch --strip=n
optionIl serait souhaitable d'avoir une option comme
patch --strip=number
(ou-pnumber
) qui coupe lesnumber
composants du chemin au début (réf. Comparaison et fusion de fichiers: répertoires de correctifs ).Autre solution, applicabilité
A défaut, il existe une autre solution, un peu hackish mais qui marche. Dans mon cas, je voulais écraser un répertoire plein de fichiers existants avec le contenu d'un zip, sans extraire le zip complet au préalable.
Lorsque cette solution fonctionne et que la solution de @ Gilles est disponible, cette dernière fonctionnera également. Pourtant, cette solution ne nécessite pas la disponibilité d'un système de fichiers FUSE.
Comment faire
En supposant que vous connaissez le répertoire supplémentaire, dans votre cas
omeka-1.5.1
, vous pouvez le faire:unzip
va essayer de décompresseromeka-1.5.1
ce qui est en fait un lien symbolique vers contenant dir. En conséquence, les fichiers atterrirontomeka
directement.Variantes possibles
Vous pouvez imaginer des variantes pour rediriger une ou plusieurs parties d'une hiérarchie depeer.
Conclusion
Cette solution est quelque peu spécifique, mais elle a ses cas d'utilisation et je viens de l'utiliser.
la source
unzip -l
. Cela pourrait même être automatisé à l'aide d'un script qui représente une partie du chemin commun.zipinfo -1
pourrait être un bon début. Quel est votre cas d'utilisation?Vous souhaitez probablement exécuter
unzip
l'-j
option, comme dans:Mais vous pourriez être surpris par son comportement:
Si vous extrayez
files.zip
dans le répertoire de sortie./output
et que vous obtenez ceci comme résultat:alors l'
-j
option vous donnera ceci (tous les chemins rayés):la source