Vous pouvez utiliser quelque chose comme :
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
Le -print0
et -T
travailler ensemble pour autoriser les noms de fichiers avec des espaces newlines, etc. Le dernier -
indique à tar de lire les noms de fichiers d'entrée à partir de stdin.
Notez que -print0
doit venir à la fin de votre déclaration, selon cette réponse. Sinon, vous obtiendrez probablement plus de fichiers que prévu.
Remarque : Voir la réponse de @Iain pour une solution un peu plus efficace.
Notez que find
appellera le -exec
action pour chaque fichier il trouve.
Si vous exécutez tar -cvf file.tar {}
pour chaque fichier find
sorties, cela signifie que vous écraserez file.tar
à chaque fois, ce qui explique pourquoi vous vous retrouvez avec une seule archive qui ne contient que anaconda.storage.log
— c'est le dernier fichier find
sorties.
Maintenant, vous voulez réellement ajouter les fichiers à l'archive au lieu de le créer à chaque fois (c'est ce que le -c
l'option le fait). Alors, utilisez ce qui suit :
find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;
Le -r
l'option s'ajoute à l'archive au lieu de la recréer à chaque fois.
Remarque : Remplacer -iname anaconda.*
avec -iname "anaconda.*"
. L'astérisque est un caractère générique et peut être développé par votre shell avant find
le voit même. Pour éviter cette expansion, placez l'argument entre guillemets doubles.
Comme pour tar
suppression du /
de début :L'archive ne doit contenir que des éléments relative noms de fichiers. Si vous avez ajouté des fichiers commençant par /
, ils seraient stockés en tant que absolus noms de fichiers, signifiant littéralement /var/…
sur votre ordinateur, par exemple.
IIRC c'est simplement une précaution pour tar
implémentations autres que GNU, et c'est plus sûr de cette façon car vous n'écraserez pas vos données réelles dans /var/…
lorsque vous extrayez l'archive si elle contient des noms de fichiers relatifs.
Essayez ceci :
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
Vous essayiez d'utiliser find
à -exec tar
. Mais la façon dont le -exec
fonctionne, il exécute cette commande une fois pour chaque fichier correspondant qu'il trouve, provoquant tar
pour écraser le fichier tar qu'il produit à chaque fois. C'est pourquoi vous n'avez fini qu'avec le dernier. De plus, vous devez mettre des guillemets autour du modèle que vous spécifiez à find
afin que le shell ne l'étende pas avant de le passer à find
.
En utilisant la substitution de commande avec des backticks (ou en utilisant $(...)
notation si vous préférez), la liste complète des noms produits par find
est recollé sur la ligne de commande en tant qu'arguments de tar
, l'amenant à les écrire tous en même temps.