Como extrair arquivos para outro diretório usando o comando 'tar'?

672

Eu pensei que tar archive.tar /users/mylocationiria funcionar, mas não funciona. Como eu posso fazer isso?

goovim
fonte
1
Além disso, -C, --directory DIR\n change to directory DIRdeve ser descrito como change output directory to DIR (will fail if DIR doesn't exist). Obrigado @Mich. Veja também a resposta de @ Bryan_Larsen.
válido
1
@Ujjwal Sing: De fato, a página do manual tar não é tão útil. Ele descreve "-C DIR" como "alteração no diretório DIR". Pior ainda: "tar -C mydir xf archive.tar" não funciona, enquanto "tar xf archive.tar -C mydir" funciona.
Pat Morin
@ PatMorin Para ser justo, depois de entender o argumento que chama convenções que você está usando, faz sentido. Você também pode fazer tar xfC archive.tar mydirou tar -C mydir -xf archive.tar. É apenas a mistura de sinalizadores de estilo tradicional e GNU que quebra as coisas, como ... é honestamente esperado. Os sinalizadores tradicionais são passados ​​como um blob como o primeiro argumento. Você não pode esperar que eles funcionem se não forem os primeiros. (Quero dizer, sim, é possível interpretá-lo de qualquer maneira - o que quero dizer é que isso seria acima e além, não padrão)
Nic Hartley

Respostas:

958

Para extrair um arquivo morto para um diretório diferente do atual, use a opção tar, -Cou --directory, como em

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

Observe que o diretório de destino deve existir antes de executar esse comando (ele pode ser criado por mkdir /target/directory).

Leia a página do manual (comando man tar:) para outras opções.

Wesley Rice
fonte
O caminho pode ser despojado: isto é apenas recuperar o arquivo
ZZAPPER
3
Se for um arquivo maior, quando você executa o comando, tudo o que você obtém é nenhuma saída por vários segundos ou até minutos enquanto estiver trabalhando. Você pode corrigir isso adicionando o -vsinalizador ( modo detalhado ) que lista o nome de cada arquivo à medida que o extrai.
IQAndreas
Se você estiver tendo problemas com isso, observe também os --strip-components=1conselhos da outra resposta.
DreadPirateShawn
9
@consultstan xkcd.com/1168
Duncan X Simpson
9
Não é surpreendente que, depois de todos esses anos, com todas as opções taracumuladas, ainda não haja uma opção para criar o diretório de saída, se ele não existir ?
EM0
261

Observe que se o seu tarball já contiver um nome de diretório que você deseja alterar, adicione a --strip-components=1opção:

tar xf archive.tar -C /target/directory --strip-components=1
Bryan Larsen
fonte
2
Obrigado. Os downloads via wget / etc sempre têm um diretório 'pai'. Esta é a resposta completa imo - ou deve ser anotada na resposta acima.
precisa saber é
É mesmo o que eu procurava. --strip-componentsé tão útil ao executar provisionadores que podem usar versões diferentes. Dessa maneira, /target/directorypode ser um nome genérico, sem ter que se preocupar com como o provedor escolheu nomear sua pasta de arquivamento.
Jack_Hu 30/01
30

Combinando as respostas e comentários anteriores:

Para simplesmente extrair o conteúdo e criar o diretório de destino, se estiver ausente:

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

Para extrair e também remover o diretório raiz (primeiro nível) no zip

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

Outra opção é usar --one-top-level. Isso criará automaticamente um diretório com base no nome do arquivo do original.

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

Além disso, se desejar, você pode especificar o seu próprio e o tar o criará automaticamente.

tar zxvf filename.tgz --one-top-level=new_directory
Dean Householder
fonte
3
Estou usando GNU tar 1,26 e eu recebo um erro de opção não reconhecida para--one-top-level
Emma Strubell
Esta é a resposta que eu precisava. Muito útil "não" para especificar o nome do diretório ou lembrar-se de um código especial que se refere ao arquivo para o nome. Obrigado.
Hipócrito
2

O que achei interessante em relação à extração é que depende de como você criou o arquivo, veja este exemplo

cd /tmp
mkdir folder
touch folder/file.txt

quando você faz tar -zcvf folder.tar.gz foldertudo como esperado = quando você descompactar agora, ela será descompactada (a pasta será criada, se você a tiver removido) como /tmp/folder/.

Mas, quando você criar o tar as tar -zcvf tmp-folder.tar.gz /tmp/foldere descompactá-lo na pasta / tmp, o resultado será o /tmp/tmp/folderdiretório! Nesse caso, você precisa descompactá-lo para / -tar -xf tmp-folder.tar.gz -C /

Betlista
fonte
1

Com o tar 1,29, podemos apenas adicionar o nome do diretório após o nome do arquivo tar. Por exemplo,

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