sortie de la tuyauterie de find à tar: éviter les liens en double avec les fichiers de l'archive

1

Lorsque vous redirigez la sortie de findsur tar, deux liens pour chaque fichier apparaissent dans l'archive résultante. Ce n'est pas le cas si tarest appliqué directement au répertoire. Les liens en double peuvent-ils être évités?

Voici un exemple:

$ mkdir tmp
$ for i in {1..3}; do echo "$i" > "tmp/$i"; done
$ ls tmp
1  2  3
$ tar -cvvf tmp.tar tmp | sort
drwxr-xr-x usr/grp   0 2019-05-02 15:09 tmp/
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/1
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/2
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/3
$ find tmp | tar -T - -cvvf tmp.tar | sort
drwxr-xr-x usr/grp   0 2019-05-02 15:09 tmp/
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/1 link to tmp/1
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/2 link to tmp/2
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/3 link to tmp/3
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/1
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/2
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/3

Cela a été fait avec GNU tar 1.26.

utilisateur001
la source

Réponses:

2

Comme l'a souligné Steeldriver, le problème était que tarnon seulement les fichiers contenus dans le répertoire étaient reçus, mais également le répertoire lui-même. Le comportement par défaut de tarest de recurse à travers des répertoires. Ainsi, chaque entrée du répertoire a été ajoutée une seconde fois (une fois par la fourniture explicite des fichiers et une autre par récursion dans le répertoire fourni explicitement). La solution consiste soit (1) à ne pas fournir de répertoires, soit (2) à désactiver la récursivité.

Le premier ressemblerait à ceci:

$ find tmp -type f -print0 | sort -z | tar --null -T - -cvvf tmp.tar
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3

Le second cas (dont j'ai besoin puisque je veux reproduire une structure de répertoire complète et imbriquée) consiste à simplement désactiver la récursivité:

$ find tmp -print0 | sort -z | tar --no-recursion --null -T - -cvvf tmp.tar
drwxr-xr-x usr/grp     0 2019-05-02 17:06 tmp/
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3
utilisateur001
la source