tar: Eliminando los principales '/' de los nombres de los miembros


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

¿Cómo puedo resolver este problema y mantener los /nombres en los archivos?


2
¿Qué no funciona exactamente como se esperaba?

34
No es un problema. No desea barras inclinadas en un archivo tar. Seriamente. Si desea extraer un archivo a la raíz de su sistema, especifique -C /al extraerlo.
ThiefMaster

Respuestas:


69

Use la opción --absolute-nameso -Ppara deshabilitar esta función.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
Esta es la respuesta correcta, pero tenga en cuenta que, en la mayoría de los casos, esto no es lo que desea , ya que da como resultado un archivo que se extrae en rutas completas.
rubo77

8
Usar la -C /opción como se describe en la respuesta de @Marcus eliminará el mensaje STDERR si ese es su objetivo principal.
Matt Sanders

1
Como comentó @ rubo77, generalmente este no es el resultado esperado del comando.
alfredocambera

3
La mayoría de las veces esto no es lo que un usuario quiere, simplemente porque la mayoría de ellos no leen el manual hasta que lo necesitan (nadie tiene tiempo para eso). Por lo tanto, sería prudente, al menos, expandir su respuesta, advirtiéndole a las personas que no hagan esto a menos que estén absolutamente seguros de entender cuál es el efecto. Especialmente ser aceptado como respuesta.
Mladen B.

1
@Toskan Ejemplos agregados
Barmar

89

Eso es en realidad una característica, no un problema. Los archivos con ubicaciones absolutas son un riesgo de seguridad. Los atacantes podrían usar dichos archivos para engañar a los usuarios para que instalen archivos en ubicaciones críticas del sistema.

Sí, podrías usarlo -P. Pero, ¿qué tiene de malo permitir que tar elimine la barra diagonal y simplemente requerir que el usuario del archivo haga la extracción explícitamente en el directorio raíz? Entonces están afectando conscientemente las ubicaciones críticas del sistema, y ​​no pueden hacerlo por accidente.


55
A veces las características son problemas. Encontré este hilo después de configurar un script de copia de seguridad que enviaría un correo electrónico en un estado de salida distinto de cero tar. Este mensaje en particular estaba causando tarque saliera con un estado de 1, lo que estaba causando que recibiera alertas de correo electrónico falsas sobre copias de seguridad exitosas, simplemente porque tarestaba escribiendo este mensaje en STDERR. Solucioné este problema usando mi propia versión modificada de la solución de cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
@Marcus

1
Creo que hay algunos casos de uso para usar -P, por ejemplo, si proporciona algún tipo de función de captura de imágenes del sistema de archivos en FUSE. En ocasiones, es posible que desee descomprimir una instantánea en un directorio específico en lugar de cwddesde la perspectiva del usuario.
DIMMSum

81

Si desea deshacerse de "Eliminar los principales '/' de los nombres de los miembros 'que se imprimen en STDERR, pero aún así desea omitir esas barras inclinadas como lo hace sabiamente el alquitrán por defecto, vi una excelente solución aquí por el comentarista timsoft.

La solución implica usar la opción -C para cambiar el directorio a la raíz (/), luego especificar el árbol de archivos para archivar sin una barra inclinada, porque ahora solo necesita una ruta relativa. Esto hace lo mismo que un comando normal de creación de tar, pero no se necesita quitar:

tar fcz bkup.tar.gz -C / home/foo/

No funcionará con copias de seguridad incrementales. Pero una buena respuesta.
gajdipajti 05 de

Tampoco funciona si desea tar archivos denotados por shell-expansion (por ejemplo tar c -C / home/foo/*), porque el shell no sabe acerca de la raíz modificada. Pero sigue siendo una buena respuesta para otros casos.
Boris

1
-C /no me funciona, punto. No previene el stderr para mí.
Acumenus

3
@ABB asegúrese de que la ruta que sigue a -C / sea relativa.
zurfyx

¿Funcionará este enfoque si un usuario no tiene permisos en el directorio raíz?
Mladen B.

31

Un mes tarde, pero encontré que la solución más adecuada para mi caso (en un script de shell) es ir al directorio principal y ejecutar el comando allí.

cd /var/www/
tar -czf mysite.gz mysite

En lugar de:

tar -czf /var/www/mysite.gz /var/www/mysite

99
De hecho, podría haberlo hecho usando: tar -zcvf mysite.gz -C / var / www / mysite / El beneficio de esto es que puede ejecutarlo desde cualquier directorio
alfredocambera

Gracias por tu ayuda. Esto es lo que necesitaba. No quería la ruta completa en mi tarball, solo la carpeta de destino.
Christia

Esto probablemente debería haber sido aceptado como una respuesta correcta, creo.
Mladen B.

No veo cómo esto responde a la pregunta en absoluto. Es algo diferente que se podría hacer. ... ... ... Como: P: ¿Cómo llego desde Los Ángeles a Nueva York? A: Ve a San Francisco en su lugar.
G-Man

Estoy de acuerdo con @ G-Man. Esto dará como resultado un archivo tar con una estructura de directorio completamente diferente. En algunos casos, esa estructura de directorios es realmente más apropiada en primer lugar, pero no responde la pregunta.
Kevin Keane el

7

Esta es la forma en que lo hice usando el método de fuerza bruta: 2>&1 | grep -v "Removing leading".

Por ejemplo:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

44
El problema con esto es que oculta el código de error. Entonces, si desea verificar el código de error de tar en un script bash, entonces no devolverá 0 en caso de éxito.
Brian

@staticx, el código de error es 0 independientemente.
Acumenus

1
@ABB Mi tarcomando puede devolver 2un error fatal.
Jite

1
@Brian puedes usar $ PIPESTATUS para obtener el código de salida. Ver unix.stackexchange.com/questions/14270/…
simpleuser

3

Intente utilizar -Csolo la ruta que evitaría comprimir con rutas completas:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

Resolví este problema con:

cd /home/foo && tar czf ~/backup.tar.gz .

de esa manera no estás tratando de poner rutas absolutas en el archivo tar en primer lugar. Si desea descomprimirlo en la raíz del sistema de archivos, simplemente

cd / && tar xzf backupt.tar.gz después de transferirlo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.