¿Cómo extraer archivos a otro directorio usando el comando 'tar'?

672

Pensé tar archive.tar /users/mylocationque funcionaría, pero no funciona. ¿Cómo puedo hacer eso?

goovim
fuente
1
Además, -C, --directory DIR\n change to directory DIRmás bien debería describirse como change output directory to DIR (will fail if DIR doesn't exist). Gracias @Mich. Ver también la respuesta de @ Bryan_Larsen.
válido el
1
@Ujjwal Sing: De hecho, la página del manual de alquitrán no es tan útil. Describe "-C DIR" como "cambiar al directorio DIR". Peor aún: "tar -C mydir xf archive.tar" no funciona, mientras que "tar xf archive.tar -C mydir" sí.
Pat Morin
@PatMorin Para ser justos, una vez que entiendes el argumento que llama convenciones que estás usando tiene sentido. También puedes hacer tar xfC archive.tar mydiro tar -C mydir -xf archive.tar. Solo mezcla banderas de estilo tradicional y de estilo GNU lo que rompe las cosas, como ... honestamente se espera. Las banderas tradicionales se pasan todas como un blob como primer argumento. No puedes esperar que funcionen si no son los primeros. (Quiero decir, sí, es posible interpretarlo de todos modos, mi punto es que estaría por encima y más allá, no estándar)
Nic Hartley

Respuestas:

958

Para extraer un archivo a un directorio diferente al actual, use la opción -Co --directorytar, como en

tar -xf archive.tar -C /target/directory

Tenga en cuenta que el directorio de destino debe existir antes de ejecutar ese comando (puede ser creado por mkdir /target/directory).

Lea la página del manual (comando:) man tarpara otras opciones.

Wesley Rice
fuente
Se puede pelar el camino: es decir, simplemente recuperar el archivo
zzapper
3
Si se trata de un archivo más grande, cuando ejecuta el comando, todo lo que obtiene es que no sale durante varios segundos o incluso minutos mientras está funcionando. Puede solucionar esto agregando la -vbandera ( modo detallado ) que enumera el nombre de cada archivo a medida que lo extrae.
IQAndreas
Si tiene problemas con esto, tenga en cuenta los --strip-components=1consejos de la otra respuesta también.
DreadPirateShawn
99
@consultstan xkcd.com/1168
Duncan X Simpson el
99
¿No es sorprendente que, después de todos estos años, con todas las opciones taracumuladas, todavía no haya una opción para crear el directorio de salida si no existe ?
EM0
261

Tenga en cuenta que si su tarball ya contiene un nombre de directorio que desea cambiar, agregue la --strip-components=1opción:

tar xf archive.tar -C /target/directory --strip-components=1
Bryan Larsen
fuente
2
Gracias. Las descargas a través de wget / etc siempre tienen un directorio 'padre'. Esta es la respuesta completa de la OMI, o debe anotarse en la respuesta anterior.
bshea
Justo lo que estaba buscando. --strip-componentses muy útil cuando se ejecutan aprovisionadores que pueden usar diferentes versiones. De esta manera /target/directorypuede ser un nombre genérico, sin tener que preocuparse por cómo el proveedor eligió nombrar su carpeta de archivo.
Jack_Hu
30

Combinando las respuestas y comentarios anteriores:

Para simplemente extraer el contenido y crear el directorio de destino si falta:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Para extraer y también eliminar el directorio raíz (primer nivel) en el zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1
Thamme Gowda
fuente
20

Otra opción es usar - one-top-level. Esto creará automáticamente un directorio basado en el nombre del archivo del original.

tar zxvf filename.tgz --one-top-level

Además, si lo desea, puede especificar el suyo y tar lo creará automáticamente.

tar zxvf filename.tgz --one-top-level=new_directory
Dean Householder
fuente
3
Estoy usando GNU tar 1.26 y obtengo un error de opción no reconocido para--one-top-level
Emma Strubell
Esta es la respuesta que necesitaba. Muy útil "no" para tener que especificar el nombre del directorio, o recordar un código especial que hará referencia al archivo para el nombre. Gracias.
Hipocrito
2

Lo que encontré interesante en relación con la extracción es que depende de cómo hayas creado el archivo, mira este ejemplo

cd /tmp
mkdir folder
touch folder/file.txt

cuando hace tar -zcvf folder.tar.gz foldertodo es como se esperaba = cuando lo descomprime ahora, no se descomprimirá (la carpeta se creará, si la eliminó) como /tmp/folder/.

Pero, cuando cree tar como tar -zcvf tmp-folder.tar.gz /tmp/foldery lo descomprima en la carpeta / tmp, ¡el resultado será el /tmp/tmp/folderdirectorio! En tal caso, debe descomprimirlo en / -tar -xf tmp-folder.tar.gz -C /

Betlista
fuente
1

Con tar 1.29, podemos agregar el nombre del directorio después del nombre del archivo tar. Por ejemplo,

tar zxvf tar-file directory-name/
Shunmuga priyan Selvaraju
fuente