descompacte 'tar', mas altere o nome do diretório para extrair para

26
tar -tf filename.tar
folder1/file
folder1/name
[...]

Eu gostaria de extrair o arquivo e o nome para, folder2 . Isso pode ser feito como uma linha?

Felipe Alvarez
fonte

Respostas:

35

Use -Ce --strip-components(veja man tar).

Exemplo:

mkdir FOLDER
# for remote tar file
curl -L ’remote_tar_file' | tar -xz - -C FOLDER --strip-components=1

# for local tar file
tar -xzf FILENAME -C FOLDER --strip-components=1

Explicação:

O -Csinalizador supõe que um diretório já esteja no local para que o conteúdo do arquivo tar possa ser expandido nele. daqui o mkdir FOLDER.

A --strip-componentsflag é usada quando um arquivo tar naturalmente se expande para uma pasta, digamos, como o github, onde é exemplo de repo-name-masterpasta. É claro que você não precisaria da pasta de primeiro nível gerada aqui, portanto, a --strip-componentsconfiguração 1removeria automaticamente a primeira pasta para você. Quanto maior o número for definido, as pastas aninhadas mais profundas serão removidas.

Marian
fonte
Eu li man tar. Não localizou --strip-components. nice one
Felipe Alvarez
1
tar-1.14 usa --strip-path, tar-1.14.90 + usa --strip-components. Talvez problema aqui?
Mikhail Moskalev 26/06
Eu recomendaria isso se desse um exemplo e não apenas as opções, como declara o manual on - line , 3 estilos de argumento geram confusão.
Iain
Esqueceu -f no tar -xz, pensa-me. Falha para mim. Eu pensei que eu estava usando isso para nenhuma razão de todo esse tempo ...
John Carrell
17

Você também pode usar a --transformopção para um pouco mais de flexibilidade. Ele aceita qualquer operação de substituição.

Por exemplo, é assim que eu extraio um tarball do Linux para um novo diretório para poder aplicar um patch:

tar -xjf linux-2.6.38.tar.bz2 --transform 's/linux-2.6.38/linux-2.6.38.1/'
Tom
fonte