Est-il possible de renommer un répertoire à l'intérieur d'une archive tar? Mon cas d'utilisation est que j'ai un fichier de spécifications RPM fourni en externe qui suppose une archive tar avec une certaine structure de répertoires, et j'ai une archive tar fournie en externe dont le nom de répertoire de niveau supérieur ne correspond pas à ce que le fichier de spécifications attend. Je ne contrôle ni le script qui génère les tarballs ni le fichier de spécifications RPM, je ne peux donc pas modifier l'un de ceux-ci pour qu'ils correspondent à l'autre.
Ce que j'ai fait, c'est de décompresser, de changer le nom du répertoire, puis de créer une nouvelle archive tar, mais je me demandais s'il y avait une alternative à cela.
Réponses:
Cela ne devrait pas être très difficile, du moins pour les archives qui sont compatibles avec l'ancien format où les noms de fichiers sont stockés dans un champ de taille fixe (100 octets), mais je ne connais aucun outil capable de renommer un fichier en place dans une archive tar. De plus, avec une archive compressée, vous devrez de toute façon créer un nouveau fichier.
Cela devrait être encore plus facile, mais je ne connais aucun outil existant qui puisse filtrer une archive, renommer les fichiers au fur et à mesure. Vous pouvez en créer une au-dessus des bibliothèques tar dans les langages de script; par exemple, voici un script de preuve de concept pour renommer un répertoire dans une archive tar en utilisant Perl avec
Archive::Tar
. L'archive est entièrement chargée en mémoire; il s'agit d'une limitation intrinsèque deArchive::Tar
.GNU tar n'a pas la possibilité de renommer les membres à la volée, mais
pax
(le remplacement de POSIX pourcpio
ettar
) le fait. Cependant, vous ne pouvez pas faire à lapax
fois lire et écrire à partir d'une archive. Ce que vous pouvez faire est d'exposer l'archive sous forme d'arborescence régulière via AVFS et de créer une nouvelle archive avecpax
. Cela conserve les noms de fichiers (sauf tels qu'ils ont été transformés), le contenu, les heures et les modes, mais réinitialise la propriété des fichiers (sauf s'ils sont exécutés en tant que root).la source
--transform
depuis au moins 2010 qui permet de renommer les fichiers à la volée. Pour un exemple, voir: scriptsandoneliners.blogspot.com/2019/11/…--transform
vous permet de renommer des fichiers lorsque vous créez ou extrayez une archive. Mais comment renommer des fichiers dans une archive sans l'extraire? (L'extraction n'est pas une bonne solution: vous n'avez peut-être pas assez d'espace disque; vous n'avez peut-être pas les autorisations pour conserver les informations de propriété; vous n'avez peut-être pas la possibilité de conserver les horodatages exactement ...)Le hack de sr_ et la réponse de Gilles semblent très bons, mais si votre problème est simplement le nom du répertoire racine de l'archive cible, lors de l'exécution de rpmbuild, une autre solution pourrait être de redéfinir la
%setup
macro pour effectuer le changement de nom de dir nécessaire.Quelque chose comme (vous devrez adapter et affiner votre configuration réelle, en particulier le remplacement
old-dir
etdesired-dir
et en utilisant l'outil de décompression à droite) dans votre~/.rpmmacros
:Je ne le ferais pas honnêtement si ce n'est dans la situation la plus exotique, mais la vôtre pourrait être le cas :)
la source
Il suffit de consulter cette page mais j'ai trouvé la bonne réponse ailleurs:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
Il dit que vous pouvez passer -n à la macro% setup pour indiquer à rpmbuild le nom du dossier de niveau supérieur dans l'archive tar
la source
Hack laid, mais peut-être que cela vous aide, en vous trompant
tar
avec les liens symboliques:En y réfléchissant, ce n'est probablement pas le cas, car
rpm
cela ne vous laissera pas jouer avec les argumentstar
, n'est-ce pas? (Edit: peut-être qu'untar
script wrapper délicat$PATH
pourrait vous aider à contourner ce problème.)la source