Créer un fichier zip et ignorer la structure du répertoire

219

J'ai besoin de créer un fichier zip en utilisant cette commande:

zip /dir/to/file/newZip /data/to/zip/data.txt

Cela fonctionne, mais le fichier zip créé crée une structure de répertoires imitant le répertoire dans le fichier brut. Il y a beaucoup de dossiers supplémentaires dont je n'ai pas besoin.

Je n'ai pas trouvé de réponse en un coup d'œil rapide sur la page de manuel ou une recherche Google.

Jake
la source
2
Je pensais que cette question était antérieure à tous les autres échanges de piles, mais hélas, le post de superutilisateur est en fait plus ancien que celui-ci. S'il y a quelque chose que je peux faire ici pour m'aider à le savoir. Cela doit être une réponse plutôt intéressante, car Google génère toujours autant de trafic ici. : D
Jake

Réponses:

354

Vous pouvez utiliser -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).
Lars Kotthoff
la source
20
Si -jcela ne fonctionne pas pour votre annuaire (avec -r)
consultez
Parfois, cela ne fonctionne tout simplement pas ... préférez le lien @czerasz;) qui est essentiellement un combo pushd popd
TecHunter
36

L'utilisation -jne fonctionnera pas avec l' -roption.
La solution peut donc être la suivante:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Ou version en ligne

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

vous pouvez diriger la sortie vers /dev/nullsi vous ne voulez pas que la cd -sortie apparaisse à l'écran

Vikas Tawniya
la source
En fait, vous voudrez peut-être faire ce qui suit:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23
@ eddyP23 Comment cela fait-il une différence? Cela vous fera plutôt ajouter non. de parentDir (..) pour chaque répertoire du chemin: |
Vikas Tawniya
Le résultat est le même, je suis d'accord. Mais dans les scripts automatisés qui s'exécutent dans de nombreux environnements différents, vous évitez généralement les chemins globaux, car vous n'avez aucune idée de ce que sera le chemin global. Mais à partir du, cd path/to/parent/dir/vous pouvez ../facilement calculer le nombre de points doubles .
eddyP23
@ eddyP23 a du sens
Vikas Tawniya
33

Utilisez l' -joption:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).
Dan D.
la source
18

Assez lié - je cherchais une solution pour faire de même pour les répertoires. Malheureusement, l' -joption ne fonctionne pas pour cela :(

Voici une bonne solution pour y parvenir: /superuser/119649/avoid-unwanted-path-in-zip-file

floconneux
la source
3

Vous pouvez également créer un lien symbolique temporaire vers votre fichier:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Cela fonctionne également pour un répertoire.

MirkoBanchi
la source
1

Conserver le répertoire parent pour unzipne pas cracher de fichiers partout

Lorsque vous zippez des répertoires, le fait de conserver le répertoire parent dans l'archive vous aidera à éviter de salir votre répertoire actuel lorsque vous dézipperez le fichier d'archive ultérieurement.

Donc, pour éviter de conserver tous les chemins, et puisque vous ne pouvez pas utiliser -j et -r ensemble (vous obtiendrez une erreur), vous pouvez le faire à la place:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

C'est ../$(basename $PWD)la magie qui conserve le répertoire parent.

Alors maintenant, unzip my.zipnous donnerons un dossier contenant tous vos fichiers:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Au lieu de joncher le répertoire courant avec les fichiers décompressés:

file1
file2
dir1
├── file3
├── file4
AndrewD
la source
0

Utilisez simplement l' -jrmoption pour supprimer les structures de fichiers et de répertoires

zip -jrm /path/to/file.zip /path/to/file
Qader Dorosti
la source
soyez prudent, -m --move Déplacez les fichiers spécifiés dans l'archive zip; en fait, cela supprime les répertoires / fichiers cibles après avoir créé l'archive zip spécifiée. Si un répertoire devient vide après la suppression des fichiers, le répertoire est également supprimé. Aucune suppression n'est effectuée tant que zip n'a pas créé l'archive sans erreur. Ceci est utile pour conserver l'espace disque, mais est potentiellement dangereux, il est donc recommandé de l'utiliser en combinaison avec -T pour tester l'archive avant de supprimer tous les fichiers d'entrée.
catalint