tar - extraer la estructura de directorios de descarte

34

unziptiene una opción ingeniosa -j, por la cual se descarta la estructura de directorios del archivo y todos los archivos se extraen en el mismo directorio.

¿Hay alguna manera de hacer el tartrabajo de la misma manera? Nada en la página del manual parece indicarlo.

Entonces, ¿existe una herramienta alternativa, preferiblemente de software libre, que haga eso?

Benji XVI
fuente
Relacionado: Extracción del contenido del archivo tar al directorio principal .
G-Man dice 'reinstalar a Monica' el

Respuestas:

79

El alquitrán GNU vive de la featuritis, por lo que, naturalmente, también tiene algunas opciones para eso.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Si solo desea eliminar algunos segmentos de ruta, entonces --strip-components=no --strip=na menudo lo hará:

 tar xvzf tgz --strip=1

Pero también es posible regex-reescribir los archivos a extraer (las banderas son --transformo --xformy aceptan ereg con el /xmodificador):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Para enumerar un alquitrán, necesita la --show-transformedopción adicional :

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Creo que las opciones de reescritura también funcionan para empacar, no solo para extraer. Pero paxobviamente tiene una sintaxis más agradable.

mario
fuente
44
¿Por qué no s#.*/##?
l0b0
3
La tira me alegró el día. ¡Gracias!
SamStephens
--stripno se menciona en la página del manual de os x tar, pero funciona de todos modos, ¡gracias!
slf 01 de
3
Mucho mejor que la respuesta aceptada.
Klaatu von Schlacker
¿Hay alguna diferencia entre --stripy --strip-components?
Joel Berkeley
13

Puede hacerlo con bastante facilidad en dos pasos. Adaptarse según sea necesario:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
MikeyB
fuente
así es como lo haría (usando en find -exec mv -ilugar de find | xargs) ... pasos simples que puedo repetir en cualquier sistema sin tener que cargar un script para hacerlo por mí.
quack quijote
1
+1, tmpdir=$( mktemp -d )es útil al crear directorios temporales
sorki
8

pax puede hacerlo:

pax -v -r -s '/.*\///p' < archive.tar

o

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

Puede verificar la operación de reemplazo de nombre primero omitiendo la -ropción.

hfs
fuente
1

Una posible solución que no requiere instalar nada.

  1. usa a tar tvfpara tomar todos los archivos del tarball
  2. Extraiga esos archivos individualmente: tenga extracto de tar para stdout y redirija a $ filename

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

guardar como extract.sh y ejecutar como extract.sh myfile.tar. También sobrescribirá cualquier nombre de archivo duplicado encontrado en los directorios extraídos del tarball.

DaveParillo
fuente
En realidad, acabo de probarlo en un árbol de directorios en casa y falla en archivos que contienen espacios. Veré si no puedo publicar una actualización.
DaveParillo
Lo arregló, pero no es tan bonito como antes.
DaveParillo
-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

La -Oopción extrae un archivo a la salida estándar y >redirige esa salida a un archivo. Entonces, en mi ejemplo, estoy extrayendo foo.mp3 y redirigiéndolo a bar.mp3. Los nombres de los archivos son arbitrarios.

Klaatu von Schlacker
fuente