¿Extracto de alquitrán en el directorio con el mismo nombre base?

18

Tengo un archivo comprimido como myArchive123.tar.gz. En su interior contiene una carpeta comohelloWorld

Si lo extraigo: tar -xf myArchive123.tar.gzobtengo la helloWorldcarpeta:

ls 
myArchive123.tar.gz
helloWorld 

Me gustaría que la salida sea el mismo nombre que el nombre del archivo menos la extensión .tar.gz. Es decir:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

Se puede hacer esto?

  • Nunca sé lo que hay dentro del archivo. Podría ser una carpeta, podría haber muchos archivos.
  • Estaría bien con el uso de otra herramienta si tar no puede hacerlo.
  • Estaría bien con una forma más larga que se puede convertir en un script

EDITAR
Mientras tanto, me pirateé un script que parece hacer el trabajo. (Ver mi respuesta publicada a continuación). Si se puede mejorar, no dude en publicar comentarios / respuestas adicionales. Lo principal es que debe empacarse en una sola línea como:

extract <file>
Leo Ufimtsev
fuente
1
¿El archivo siempre contiene exactamente una carpeta?
Mark Plotnick
No sé lo que hay dentro en el momento de la extracción. Esto tampoco debería depender de lo que hay dentro del archivo. Si es una carpeta, extraiga la carpeta allí. si es un archivo, extraiga todos los archivos.
Leo Ufimtsev
Mientras tanto, armé un guión (ver más abajo). Puedo aceptar la respuesta solo en 2 días tú.
Leo Ufimtsev
¿El archivo contendrá alguna vez más de una carpeta en el nivel superior?
Mark Plotnick

Respuestas:

10

Con gnu tar, puede usar --xform(o --transform) para anteponer /prefix/a cada nombre de archivo:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

nota hay ninguna está llevando /en prefix/y los sedextremos de expresión con Sexcluir objetivos enlace simbólico desde las transformaciones de nombre de archivo.
Para probarlo (ejecución en seco):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

Para comenzar, aquí hay un script muy simplista que puede invocar como extract <file>:

STRIP = $ {1%. *} #Strip último sufijo
NOMBRE = $ {STRIP% .tar} #strip .tar sufijo, si está presente
tar -xf "$ 1" --xform = "s | ^ | $ NAME / | S" #run comando
don_crissti
fuente
Esto está cerca de lo que quiero, con la excepción de que me gustaría poder empaquetarlo en algo como: extract <file>
Leo Ufimtsev
Esto tiene errores, se detiene en el primer punto. Por ejemplo, tengo un archivo como este: eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz Espero una salida sin .tar.gz, pero obtengo eclipse-sdk-4
Leo Ufimtsev
En el script anterior, elimino la extensión y la elimino aún más si encuentro un 'tar'.
Leo Ufimtsev
En general, con muchos tipos de archivos. Esperaba una frase rápida, pensé que tal vez me faltaba alguna bandera de discusión. Pero parece que no hay una solución trivial para esto?
Leo Ufimtsev
Buen material. Esto funciona y es más corto que el guión que escribí. ¡Agradable!
Leo Ufimtsev
7

Bueno, podrías hacerlo al menos en un par de pasos. Si lo hiciste

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

eso llevaría a cabo la tarea, aunque todavía puede haber una respuesta más compacta.

Eric Renouf
fuente
3

Editar

La respuesta aceptada es más corta que la siguiente. (hacer lo mismo, pero más corto suele ser mejor).


Finalmente me pirateé un guión para la tarea en cuestión. funciona con .tar .tar.gz y .gz

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

Uso:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

Tenga en cuenta que esta solución es capaz de puntos en un nombre de archivo. Por ejemplo, Eclipse-4.5M-SDK.tar.gz.

Mantengo el guión en mi repositorio de git. Para la última versión, consulte: https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here

Leo Ufimtsev
fuente
2

Una posible solución más es usar la --transformopción:

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

Con tus archivos:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"
svq
fuente
1
pero esto supone que sabes lo que hay dentro del archivo
Leo Ufimtsev
por ejemplo, ¿cómo convertiría esto en un script de una línea sin saber qué hay dentro del archivo?
Leo Ufimtsev
Estás en lo correcto. Es solo una posible solución como escribí aquí ...
svq
¿hay alguna diferencia entre eso y --strip-compoments = 0 myArchive123?
Leo Ufimtsev
1
Y --strip-components=0simplemente elimina el primer nombre de directorio de la ruta y con la -Copción almacena los archivos sin archivar en el nuevo directorio.
svq