Compressez un fichier sans inclure le répertoire parent

12

J'ai un dossier contenant plusieurs fichiers

dossier

  • artifact1.app
  • artifact2.ext2
  • artifact3.ext3
  • ...

Mon objectif est de compresser le fichier depuis l'extérieur de ce dossier (donc sans utiliser de cdcommande) sans inclure le répertoire du dossier.

zip -r ./folder/artifact.zip ./folder/artifact1.app

Cette commande inclut le répertoire du dossier dans le zip final. Des indices?

Question connexe: compresser le contenu d'un dossier sans inclure le dossier lui-même

Lorenzo B
la source
1
À partir des pages de manuel, il semble que seul -js'appliquerait, ce qui compresserait tous les dossiers dans un seul répertoire racine au sein du ZIP. Ce n'est pas ce que vous cherchez, n'est-ce pas?
phyrfox
@phyrfox Peut-être que oui. Besoin de le vérifier. Merci.
Lorenzo B

Réponses:

13

Si vous souhaitez stocker tous les fichiers foldersous leur nom sans indication de répertoire, vous pouvez utiliser l' -joption.

zip -j folder/artifact.zip folder/artifact1.app folder/artifact2.ext2 folder/artifact3.ext3

ou

zip -j folder/{artifact.zip,artifact1.app,artifact2.ext2,artifact3.ext3}

Si vous avez des fichiers dans des sous-répertoires, ils n'auront pas non plus de composant de répertoire dans l'archive, par exemple folder/subdir/fooseront stockés dans l'archive sous foo.

Mais il serait probablement plus facile de passer au répertoire. C'est presque exactement la même quantité de frappe que la méthode d'accolade aboe. Si vous faites cela, si vous incluez des fichiers dans des sous-répertoires, ils auront leur chemin relatif depuis le répertoire dans lequel vous avez changé, par exemple folder/subdir/fooseront stockés sous subdir/foo.

(cd folder && zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3)

Pour une utilisation interactive, vous perdez l'achèvement du shell de cette façon, car le shell ne se rend pas compte que vous serez dans un répertoire différent lorsque vous exécuterez la zipcommande. Pour y remédier, exécutez la cdcommande séparément. Pour revenir facilement au répertoire précédent, vous pouvez utiliser pushdet popd.

pushd folder
zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3
popd

Si vous voulez un contrôle total sur les chemins stockés dans un fichier zip, vous pouvez créer une forêt de liens symboliques. Sauf indication contraire, zipne stocke pas de liens symboliques.

Gilles 'SO- arrête d'être méchant'
la source
Vous n'avez pas à lister explicitement tous les fichiers dans le sous-répertoire ( folder), vous pouvez simplement utiliser un caractère générique, c'estzip -j folder/*
Jakub Kukul
S'appuyer sur l'expansion du shell signifie que les fichiers dot (par exemple .profile) ne seront pas inclus dans l'archive. Au lieu de cela, changez le répertoire de travail actuel et spécifiez .comme fichier à archiver:cd folder && zip -r ../folder.zip .
sheldonh