¿Es posible cambiar el nombre de un directorio dentro de un archivo tar? Mi caso de uso es que tengo un archivo de especificación RPM provisto externamente que asume un tarball con una determinada estructura de directorio, y tengo un tarball proporcionado externamente cuyo nombre de directorio de nivel superior no coincide con lo que el archivo de especificación espera. No controlo ni el script que genera los tarballs ni el archivo de especificaciones RPM, por lo que no puedo hacer un cambio en ninguno de ellos para que coincida con el otro.
Lo que he estado haciendo es desmarcar, cambiar el nombre del directorio y luego crear un nuevo tarball, pero me preguntaba si había una alternativa para hacerlo.
Respuestas:
No debería ser muy difícil, al menos para los archivos que son compatibles con el formato antiguo donde los nombres de archivo se almacenan en un campo de tamaño fijo (100 bytes), pero no conozco ninguna herramienta que pueda cambiar el nombre de un archivo archivo en su lugar en un archivo tar. Además, con un archivo comprimido, necesitaría crear un nuevo archivo de todos modos.
Debería ser aún más fácil, pero no conozco ninguna herramienta existente que pueda filtrar un archivo, renombrar archivos a medida que avanza. Puede construir uno sobre las bibliotecas de tar en lenguajes de script; por ejemplo, aquí hay un script de prueba de concepto para cambiar el nombre de un directorio en un archivo tar usando Perl con
Archive::Tar
. El archivo se carga completamente en la memoria; Esta es una limitación intrínseca deArchive::Tar
.GNU tar no tiene la capacidad de renombrar miembros sobre la marcha, pero
pax
(el reemplazo de POSIX paracpio
ytar
) sí. Sin embargo, no puede hacer quepax
tanto leer como escribir desde un archivo. Lo que puede hacer es exponer el archivo como un árbol normal a través de AVFS y crear un nuevo archivo conpax
. Esto retiene los nombres de los archivos (excepto los transformados), los contenidos, los tiempos y los modos, pero restablece la propiedad del archivo (a menos que se ejecute como root).fuente
--transform
desde al menos 2010 que permite renombrar archivos sobre la marcha. Para ver un ejemplo, consulte: scriptsandoneliners.blogspot.com/2019/11/…--transform
permite cambiar el nombre de los archivos cuando crea o extrae un archivo. Pero, ¿cómo cambiar el nombre de los archivos en un archivo sin extraerlo? (La extracción no es una buena solución: es posible que no tenga suficiente espacio en el disco; es posible que no tenga los permisos para preservar la información de propiedad; es posible que no tenga la capacidad de preservar las marcas de tiempo exactamente ...)Tanto el truco de sr_ como la respuesta de Gilles se ven muy bien, pero si su problema es solo el nombre del directorio raíz del tarball objetivo, mientras ejecuta rpmbuild, una solución diferente podría ser redefinir la
%setup
macro para hacer el cambio de nombre de directorio necesario.Algo así como (que tendrá que adaptarse y perfeccionar esto a su configuración actual, en particular, la sustitución
old-dir
y eldesired-dir
y el uso de la herramienta de descompresión derecha) esta en su~/.rpmmacros
:Honestamente no lo haría si no fuera en la situación más exótica, pero la tuya podría ser el caso :)
fuente
Solo vea esta página pero encontré la respuesta correcta en otro lugar:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
Dice que puede pasar -n a la macro de configuración% para decirle a rpmbuild el nombre de la carpeta de nivel superior dentro del tarball
fuente
Hack feo, pero tal vez esto te ayude, engañando
tar
con enlaces simbólicos:Pensando en ello, probablemente no lo haga, ya
rpm
que no te dejará meterte con los argumentostar
, ¿verdad? (Editar: tal vez untar
script de envoltorio complicado$PATH
podría ayudarlo a resolver esto).fuente