tar extrair no diretório com o mesmo nome base?

14

Eu tenho um arquivo zipado como myArchive123.tar.gz . Dentro dele contém uma pasta como helloWorld

Se eu extraí-lo: tar -xf myArchive123.tar.gz eu recebo a pasta helloWorld :

ls 
myArchive123.tar.gz
helloWorld 

Eu gostaria que a saída fosse o mesmo nome que o nome do arquivo menos a extensão .tar.gz. Ou seja:

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

Isso pode ser feito?

  • Eu nunca sei o que há dentro do arquivo. Poderia ser uma pasta, poderia ser muitos arquivos.
  • Eu ficaria bem em usar outra ferramenta se o tar não puder fazer isso.
  • Eu ficaria bem com um formulário mais longo que pode ser transformado em um script

EDITAR
Nesse meio tempo, eu hackeei um roteiro que parece fazer o trabalho. (veja minha resposta postada abaixo). Se puder ser melhorado, sinta-se à vontade para postar comentários / respostas adicionais. O principal é que ele deve ser empacotado em uma linha como:

extract <file>
    
por Leo Ufimtsev 23.04.2015 / 15:47

4 respostas

10

Com gnu tar , você pode usar --xform (ou --transform ) para preceder /prefix/ para cada nome de arquivo:

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

observe que não há expressão / in prefix/ e a expressão sed termina com S para excluir destinos de link simbólico de transformações de nome de arquivo.
Para testá-lo (dry-run):

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

Para começar, aqui está um script muito simplista que você poderia invocar como extract <file> :

STRIP=${1%.*}                                #strip last suffix
NAME=${STRIP%.tar}                           #strip .tar suffix, if present
tar -xf "$1" --xform="s|^|$NAME/|S"          #run command
    
por 23.04.2015 / 18:06
7

Bem, você poderia fazer isso em alguns passos, pelo menos. Se você fez

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

que realizaria a tarefa, embora possa haver uma resposta mais compacta ainda por aí.

    
por 23.04.2015 / 15:54
2

Mais uma solução possível é usar a opção --transform :

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

Com seus arquivos:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"
    
por 23.04.2015 / 16:14
2

Editar

A resposta aceita é mais curta que a abaixo. (faça a mesma coisa, mas mais curto geralmente é melhor).

Eu acabei de hackear um roteiro para a tarefa em questão. funciona com .tar.gtar e .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>

Note que esta solução é capaz de pontos em um nome de arquivo. Por exemplo, Eclipse-4.5M-SDK.tar.gz.

Eu mantenho o script no meu repositório do git. Para a versão mais recente, consulte: link

    
por 23.04.2015 / 16:34

Tags