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.
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.
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
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
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 /
-C, --directory DIR\n change to directory DIR
deve ser descrito comochange output directory to DIR (will fail if DIR doesn't exist)
. Obrigado @Mich. Veja também a resposta de @ Bryan_Larsen.tar xfC archive.tar mydir
outar -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)Respostas:
Para extrair um arquivo morto para um diretório diferente do atual, use a opção tar,
-C
ou--directory
, como emObserve 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.fonte
-v
sinalizador ( modo detalhado ) que lista o nome de cada arquivo à medida que o extrai.--strip-components=1
conselhos da outra resposta.tar
acumuladas, ainda não haja uma opção para criar o diretório de saída, se ele não existir ?Observe que se o seu tarball já contiver um nome de diretório que você deseja alterar, adicione a
--strip-components=1
opção:fonte
--strip-components
é tão útil ao executar provisionadores que podem usar versões diferentes. Dessa maneira,/target/directory
pode ser um nome genérico, sem ter que se preocupar com como o provedor escolheu nomear sua pasta de arquivamento.Combinando as respostas e comentários anteriores:
Para simplesmente extrair o conteúdo e criar o diretório de destino, se estiver ausente:
Para extrair e também remover o diretório raiz (primeiro nível) no zip
fonte
Outra opção é usar --one-top-level. Isso criará automaticamente um diretório com base no nome do arquivo do original.
Além disso, se desejar, você pode especificar o seu próprio e o tar o criará automaticamente.
fonte
--one-top-level
O que achei interessante em relação à extração é que depende de como você criou o arquivo, veja este exemplo
quando você faz
tar -zcvf folder.tar.gz folder
tudo 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/folder
e descompactá-lo na pasta / tmp, o resultado será o/tmp/tmp/folder
diretório! Nesse caso, você precisa descompactá-lo para / -tar -xf tmp-folder.tar.gz -C /
fonte
Com o tar 1,29, podemos apenas adicionar o nome do diretório após o nome do arquivo tar. Por exemplo,
fonte