Utilisez le -T
fonctionnalité de tar pour lui dire de lire la liste des fichiers d'un autre fichier (tar traite chaque ligne comme un fichier séparé).
Vous pouvez alors utiliser <()
notation pour que votre shell génère un pseudo-fichier à partir de la sortie d'une commande :
tar cf ctlfiles.tar -T <(find /home/db -name "*.ctl")
Si votre shell ne prend pas en charge <()
notation, vous pouvez utiliser un fichier temporaire :
find /home/db -name "*.ctl" > ctlfile-list
tar cf ctlfiles.tar -T ctlfile-list
rm ctlfile-list
Vous pouvez utiliser la fonctionnalité -print0 de find avec la fonctionnalité -0 de xargs, comme ceci :
find /home/db -name '*.ctl' -print0 | xargs -0 tar -cf ctlfiles.tar
-print0 (c'est-à-dire tiret-empreinte-zéro) indique à find d'utiliser un null comme délimiteur entre les chemins au lieu d'espaces, et -0 (c'est-à-dire trait d'union zéro) indique à xargs d'attendre la même chose.
Modifié pour ajouter :
Si vous avez un grand nombre de fichiers, xargs peut invoquer tar plus d'une fois. Consultez les commentaires pour savoir comment gérer cela, ou faites en sorte que find invoque directement tar, comme ceci, qui fonctionne avec n'importe quel nombre de fichiers, même s'ils ont des espaces ou des retours à la ligne dans leurs noms :
rm -f ctlfiles.tar
find /home/db -name '*.ctl' -exec tar -rf ctlfiles.tar {} +
Lorsque l'argument suivant "-T" est "-", la liste des fichiers est tirée de stdin. Les versions récentes de tar prennent généralement en charge l'option "-null", qui indique que les fichiers donnés dans la source spécifiée par le "-T " sont séparés par des valeurs nulles.
Par conséquent, ce qui suit fonctionne avec un nombre arbitraire de fichiers, contenant éventuellement des caractères de saut de ligne :
find /home/db -name '*.ctl' -print0 | tar --null -T - -cf ctlfiles.tar