archivos .tar sin estructura de directorios

32

Estoy .taring algunos archivos con la ruta example/super_user/Output.*.

El resultado se .tarve así:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Pero quiero que el archivo sea como el siguiente:

- Output.zip
- Output.xml
- Output.txt

¿Sabes cómo puedo lograr esto mientras sigo en otro directorio?

Der Hochstapler
fuente
Asegúrate de evitar las tarbombs con archivos como ese.
Grawity
tar --strip-components = 1000?
Zaar Hai

Respuestas:

11

tar preservará la estructura de archivos y carpetas, así que no creo que haya ninguna forma de instruir a tar para aplanar la jerarquía en el momento de la creación.

Una solución alternativa es cambiar temporalmente el directorio, crear el tar y luego regresar, un ejemplo rápido a continuación:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
Garfio
fuente
27

Si el directorio 'ejemplo' está en la raíz del sistema de archivos, aquí hay otra forma:

tar -C /example/super_user -cvf result.tar .

esto cambiará el directorio al punto en el que desea hacer el tar. La advertencia es que si hay subdirectorios en / example / super_user, la estructura de directorios se conservará para estos subdirectorios.

Anthony Walters
fuente
1
Esta es la respuesta al problema en cuestión. La advertencia mencionada no es un problema en este caso. Todas las demás respuestas son soluciones alternativas para tener en cuenta las variaciones del problema.
joki
De hecho, esa es la solución a esta pregunta. El directorio no tiene que ser la raíz, suponiendo que la estructura del directorio /home/u/foo/bar, el directorio de trabajo lo es /home/b, entonces tar -C foo/bar -cvf qiz.tar .funciona bien. Sin embargo, una advertencia es que no puede usar comodines, es decir tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"o tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"no funcionará.
Brice
1
Debe tenerse en cuenta que puede usar -Cvarias veces en un solo tarcomando si necesita agregar varios archivos distribuidos en varios directorios pero aún así desea que el archivo tar sea plano.
zero298
10

He publicado mi respuesta aquí:

/programming/13924856/unix-tar-do-not-preserve-directory-structure

repost (para personas perezosas)


Esto es feo ... pero funciona ...

Tuve este mismo problema, pero con varias carpetas, solo quería aplanar todos los archivos. Puede usar la opción "transformar" para pasar una expresión sed y ... funciona como se esperaba.

Esta es la expresión:

's/.*\///g' (eliminar todo antes de '/')

Este es el comando final:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

Alessio Valentini
fuente
7

Para crear un tar (ARCHIVE.tar) con todos los archivos de un directorio (DIR), sin ninguna información del directorio principal (ni siquiera ./), puede usar algo como:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Puedes jugar con la búsqueda para limitar la profundidad, seleccionar archivos específicos y muchas otras cosas.

¡Buena suerte!

Paul Bhullar
fuente
Obtengo "find: -printf: desconocido primario u operador" en el comando de búsqueda de OSX. ¿Algun consejo?
TCB13
-printfEs un comando no estándar. Muchos de esos solo funcionan con versiones específicas de find. Por lo general, los marcamos al responder a una pregunta sobre el Super Usuario (por ejemplo, con "-blah es una extensión de GNU y no funcionará en todas partes").
Hennes
3

Creé un directorio temporal. Y en el directorio, se crearon enlaces simbólicos a todos los archivos a los archivos que se incluirán. Luego hice tar -h -C. para que todos los archivos (no enlaces, sino su contenido) se incluyan en el archivo con el nombre deseado.

mzwt
fuente
1

Si ese es el contenido completo del tarball, puede usar la --strip-componentsopción GNU tar para eliminar los 2 niveles antes de los archivos.

Ignacio Vazquez-Abrams
fuente
Solo tengo la opción, --strip-pathpero usarla no cambiará nada.
1

Otra forma de cambiar temporalmente el directorio es poner los comandos cdy tardentro del paréntesis ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

La ventaja de esto es que siempre volverá a aparecer implícitamente en el directorio original cuando finalice el bloque. es decir, no es necesario pushd... popdbloques o hacer un seguimiento de dónde cdvolver.

Stephen Quan
fuente
0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd empuja la ruta del directorio actual a la DIRpila y se mueve a la carpeta de contenido. Luego, vuelve al directorio original utilizando popd.

Saravana Kumar
fuente