¿Cómo extraigo un directorio específico de un tarball? y despojar un directorio principal?

12

Quiero extraer un directorio específico del tarball de wordpress. específicamente wp-includesa .. Parece que la estructura del directorio dentro del tarball es wordpress/wp-includespero solo necesito ./wp-includesuna vez que se ha extraído, no hay un directorio principal de WordPress. ¿Cómo haría esto?

xenoterracida
fuente

Respuestas:

13

Para extraer un directorio específico (y su contenido, de forma recursiva), simplemente páselo como un argumento adicional en la línea de comando. Con GNU tar , puede eliminar un directorio principal con la --strip-componentsopción (y, en general, transformar los nombres de archivo con --transform). En sistemas que no son Linux, puede usar pax (está en POSIX, pero algunas distribuciones de Linux lo omiten de su instalación predeterminada) y su -sopción.

tar xf foo.tar --strip-components=1 wordpress/wp-includes  #GNU tar
pax -r <foo.tar -pp -s '!^wordpress/!!' wordpress/wp-includes

Puede fusionar la lista de inclusión con las reglas de reescritura agregando una regla para reescribir todo al nombre vacío (lo que significa "no extraer"; la regla solo se aplica si las reglas anteriores no coinciden).

pax -r <foo.tar -pp -s '!^wordpress/\(wp-includes/\)!\1!' -s !.*!!
Gilles 'SO- deja de ser malvado'
fuente
5

Suponiendo que tiene GNU tar, puede usar --strip-components:

$ tar xaf tarball.tar.gz --strip=1 wordpress/wp-includes

Creo que las versiones actuales de tar de BSD también son compatibles --strip-components. En el peor de los casos, podría hacer:

$ tar xzf tarball.tar.gz wordpress/wp-includes
$ mv wordpress/wp-includes .
$ rmdir wordpress
cjm
fuente
Terminé haciendo esto último solo porque tenía prisa, pero es bueno saber que el primero existe.
xenoterracide el
¿Sería posible usar un comando que no requiera nombrar explícitamente el componente eliminado (por ejemplo wordpress)? Necesito esto cuando extraigo tarballs creados por GitHub que contienen la revisión git en el componente despojado que no conozco de antemano.
tjanez