Décompressez le contenu du fichier, mais sans créer de dossier d'archive

37

J'ai un fichier myarchive.zip qui contient de nombreux répertoires, fichiers, etc. Disons que ce fichier myarchive.zip réside dans un répertoire appelé "b". Eh bien, lorsque j’utilise la commande "unzip myarchive.zip", le système crée par défaut un répertoire appelé "myarchive" avec le contenu du fichier zip. Je ne souhaite pas que le système crée ce répertoire "myarchive" - ​​je souhaite simplement que le contenu soit extrait dans le répertoire "b". Est-ce possible?

Ce que je fais maintenant consiste simplement à lancer une commande "cp" pour copier les fichiers du répertoire nouvellement créé (dans ce cas, "myarchive" vers "b") vers l'emplacement souhaité.

ScoobaSteve
la source
8
Par défaut, unzipne crée pas de répertoire. Votre fichier zip a probablement le répertoire au plus haut niveau.
Chris Down
3
Vous pouvez utiliser mvau lieu de cp. mv archive/* .; rmdir archive/ou similaire.
Frostschutz

Réponses:

45

Ma version de unzipa une -joption pour ne créer aucun répertoire.

Alors

unzip -j /path/to/file.zip

Extrait tous les fichiers du répertoire en cours sans restaurer la structure de répertoires stockée dans le zipfichier.

Si vous souhaitez supprimer uniquement un niveau de répertoires de l'archive (extraire myarchive/dir/fileau lieu de dir/file, filen'utilisez pas ), vous pouvez utiliser bsdtar(qui prend en charge les zipfichiers en plus des tarfichiers) à la place et son -soption.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'
Stéphane Chazelas
la source
8
Lorsque vous utilisez -jla structure du répertoire d'archivage, elle n'est pas recréée et tous les fichiers sont déposés dans le dossier d'extraction. Cela signifie que TOUS les sous-dossiers sont supprimés. Donc, si vous en aviez zip/A/f1, zip/A/B/f2et zip/A/B/C/f3vous vous retrouveriez avec un seul dossier avec f1, f2, f3. Cela devient amusant si vous avez des fichiers avec le même nom dans différents sous-dossiers. Habituellement, vous voulez simplement supprimer le dossier principal et non la structure de répertoires complète.
Cristian Vrabie
3
@ ChristianVrabie, eh bien c'est exactement ce que je dis dans la réponse. J'ai ajouté une alternative à bsdtar pour ce que vous demandez. Voir éditer.
Stéphane Chazelas
3

On dirait que c'est très simple avec bsdtar :

bsdtar --strip-components=1 -xvf file.zip

ismail
la source
1

Ce que la réponse acceptée ne spécifie pas comment faire, comme vous le dites dans la question, si vous souhaitez encore extraire vers un dossier spécifique sans utiliser les chemins de dossiers stockés dans les fichiers zip, vous pouvez utiliser l' -joption with -dde cette manière. :

unzip -j /path/to/file.zip -d other_folder

ou pour votre cas

unzip -j myarchive.zip -d b
Eduard Florinescu
la source
2
Vous avez raison, vous pouvez le faire. mais il ne créera pas les sous-répertoires, vous devrez donc encore intégrer une autre étape. Je suis presque sûr que l'OP veut renommer le répertoire racine de l'archive en un autre nom, tout en conservant la structure restante sous ce répertoire.
Pryftan
-1

Si effectuer unzip myarchive.zipproduit un répertoire myarchiveavec tout ce qu'il contient, cela signifie que le créateur du fichier zip a effectivement effectué le zip sur ce répertoire.

La seule façon de créer ce que vous voulez est de simplement déplacer tout le contenu en dehors du répertoire après avoir effectué unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ montre le répertoiremyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ montre le premier niveau de myarchive (directement dans b) }

toinetoine
la source
1
vous avez également besoin mv myarchive/.* .de déplacer tous les fichiers cachés comme .gitignore et .htaccess.
Kinjal Dixit
1
@KinjalDixit C'est ce que je pensais aussi; Comme le montre Kinjai, Antoine présente un défaut fatal dans votre exemple: parce que vous utilisez rm -Ret parce que vous ne l'utilisez pas, ls -avous n'indiquez pas s'il existe des fichiers point; maintenant que se passe-t-il quand vous courez rm -Ret qu'il y a des fichiers de points? Vous ne les avez pas copiés, ils sont donc perdus. Vous devriez vraiment résoudre ce problème et peut-être expliquer la différence parce que c'est quelque chose qui va beaucoup faire trébucher les débutants; et considérez ceci: et si ce n'est pas une archive qu'ils ont? Ou si ils ajoutent à la commande pour supprimer l'archive une fois décompressée?
Pryftan
Otoh rmdirs'assurerait d'abord qu'il est vide ... Mais si l'utilisateur ne connaît pas les fichiers de points, il les confondra.
Pryftan