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.



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).

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


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).


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.


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

0

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

zip -jrm /path/to/file.zip /path/to/file

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.