Créer une archive tar d'un répertoire, sauf pour les fichiers cachés?


17

Je veux créer une archive tar d'un répertoire spécifique (avec ses sous-répertoires bien sûr). Mais quand je le fais, en utilisant la commande tar, j'obtiens une liste des fichiers qui ont été inclus, par exemple:

un calendrier_final /._ style.css

un calendrier_final / style.css

Comme vous pouvez le voir, il existe deux versions du même fichier. Cela vaut pour chaque fichier, et il y en a beaucoup. Comment exclure les fichiers temporaires, avec le préfixe ._, de l'archive tar?



Ce ne sont pas des fichiers temporaires, mais représentent des métadonnées du système de fichiers OS X (si je ne me trompe pas, elles incluent les étiquettes du Finder, les codes de type et de créateur, les attributs étendus, etc.). Ces fichiers n'existent pas avant de créer le tar sur OS X. Les réponses possibles varient selon que vous êtes sur OS X / HFS + ou sur un autre système.
Daniel Beck

Réponses:


33

Vous avez signalé dans un commentaire que vous travaillez sur un système Mac OS X. Ceci est un indice important de l'objectif de ces ._*fichiers.

Ces ._*entrées d'archive sont des morceaux de données AppleDouble qui contiennent les informations supplémentaires associées au fichier correspondant (celui sans le ._préfixe). Ils sont générés par la famille de fonctions Copyfile (3) propre à Mac OS X. Les objets blob AppleDouble stockent les données de contrôle d'accès (ACL) et les attributs étendus (généralement, les indicateurs du Finder et les «fourchettes de ressources», mais les xattrs peuvent être utilisés pour stocker tout type de données).

Les outils d'archivage Mac OS X fournis par le système ( bsdtar(également associés en tant que tar), gnutaret pax) généreront un ._*membre d'archive pour tout fichier auquel sont associées des informations étendues; en mode «unarchive», ils décoderont également ces membres d'archive et appliqueront les informations étendues résultantes au fichier associé. Cela crée une archive «pleine fidélité» à utiliser sur les systèmes Mac OS X en préservant et en extrayant plus tard toutes les informations que le système de fichiers HFS + peut stocker.

Les outils d'archivage correspondants sur d'autres systèmes ne savent pas donner un traitement spécial à ces ._*fichiers, ils sont donc décompressés en tant que fichiers normaux. Étant donné que ces fichiers sont assez inutiles sur d'autres systèmes, ils sont souvent considérés comme des «fichiers indésirables». De même, si un système non-Mac OS X génère une archive qui inclut des fichiers normaux commençant par ._, les outils de désarchivage de Mac OS X essaieront de décoder ces fichiers en tant qu'informations étendues.

Il existe cependant un moyen non documenté (?) De faire en sorte que les archiveurs Mac OS X fournis par le système se comportent comme ils le font sur d'autres systèmes Unixy: la variable d'environnement COPYFILE_DISABLE. La définition de cette variable (sur n'importe quelle valeur, même la chaîne vide), empêchera les archiveurs de générer ._*des membres d'archive pour représenter toute information étendue associée aux fichiers archivés. Sa présence empêchera également les archiveurs d'essayer d'interpréter ces membres d'archives comme des informations étendues.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Vous pouvez définir cette variable dans le fichier d'initialisation de votre shell si vous souhaitez travailler de cette façon le plus souvent.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Ensuite, lorsque vous devez réactiver la fonction (pour conserver / restaurer les informations étendues), vous pouvez «dé-définir» la variable pour des commandes individuelles:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Les archiveurs sur Mac OS X 10.4 font également quelque chose de similaire, bien qu'ils utilisent une variable d'environnement différente: COPY_EXTENDED_ATTRIBUTES_DISABLE


quelqu'un a vu que cela ne fonctionnait pas? J'ai essayé cette solution sur Yosemite et quand je décompresse sur une boîte AIX les répertoires PaxHeader sont toujours générés
conorgriffin

5

Cela devrait fonctionner:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

Je pensais que cela fonctionnait mais en fait quand j'ai déballé l'archive, j'ai trouvé qu'elles avaient été incluses: /

Bizarre, quelle version de tar utilisez-vous? tar --versiondonne GNU 1.23 ici.
Frederik Deweerdt

1
Ces fichiers sont des métadonnées du système de fichiers sur OS X et n'existent pas avant d'exécuter tar, ils ne peuvent donc probablement pas être exclus de cette façon. Ils sont inclus pour permettre la restauration des métadonnées des fichiers OS X lors du déballage archivé sur un autre Mac.
Daniel Beck

Travaille pour moi. Je recommande d'utiliser tar vzcf ...pour voir si des fichiers incorrects ont été inclus.
stribika

@stribika Il est très probablement sous OS X. Voir mon commentaire sur la question. Les fichiers ne peuvent pas être exclus car ils n'existent pas en dehors de l'archive tar.
Daniel Beck

2

Frederik Deweerdt a donné une solution qui fonctionne sur GNU tar (utilisé sur Linux, Cygwin, FreeBSD, OSX, éventuellement d'autres), mais pas sur d'autres systèmes tels que NetBSD, OpenBSD ou Solaris.

POSIX ne spécifie pas la tarcommande (car elle varie trop fortement entre les variantes d'Unix) et introduit la paxcommande à la place. L'option -wsignifie produire une archive ( -rextraits) et -xsélectionner le format d'archive. L'option -s '!BRE!!'exclut tous les fichiers dont le chemin correspond à l'expression régulière de base BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

Intéressant ... Je ne connaissais pas pax.
gabe.

2

Depuis bsdtar 3.0.3 - libarchive 3.0.3(et peut-être plus tôt), il existe une nouvelle option (spécifique à Mac OS X) à la bsdtarcommande appelée --disable-copyfilepour supprimer la création de ._fichiers. Les versions antérieures de tarn'ont pas l' --disable-copyfileoption, mais la définition de la variable d'environnement COPYFILE_DISABLE=1devrait fonctionner.


Avec bsdtar 2.8.3 - libarchive 2.8.3de 10.7.5l' --disable-copyfileest , mais pas documentée disponible tout de même.
Stefan Schmidt

0

Suivez ces étapes:

  1. Recherchez tous les ._fichiers et répertoriez-les en utilisant de -lssorte que vous puissiez voir tous les ._fichiers et enfin les supprimer.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Créez l'archive .tar à l'aide de.

    tar -cvf name.tar /path/to/directory
    
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.