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.