GNU/Linux >> Tutoriels Linux >  >> Linux

Comment combiner la commande 'tar' avec 'find'

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.


Linux
  1. Rechercher des fichiers et des répertoires sous Linux avec la commande find

  2. Comment utiliser la commande Tar sous Linux

  3. Comment auditer les autorisations avec la commande find

  4. Comment trouver le processus avec un maximum de descripteurs de fichiers ?

  5. Comment trouver le gestionnaire de fichiers par défaut ?

Comment utiliser la commande Linux head

Comment utiliser la commande Linux diff

Comment créer une sauvegarde avec la commande tar sous Linux

Comment utiliser la commande Linux rm avec des exemples

Comment rechercher des fichiers avec la commande fd sous Linux

Comment rechercher des fichiers avec des dizaines de critères avec la commande Bash Find