Como eu uso gunzip e tar para extrair meu arquivo tar.gz para o diretório específico que eu quero?

2

Quando executo gunzip -dc /path_to_tar.gz_file/zip1.tar.gz | tar xf - no diretório em que o arquivo tar.gz está localizado, ele é extraído bem.

Como posso dizer para colocar o conteúdo do arquivo tar.gz em um diretório específico?

Eu tentei este gunzip -dc /path_to_tar.gz_file/zip1.tar.gz | tar xf /target_directory com um erro tar .

Também devo observar aqui que estou tentando fazer isso em um script bash e que estou executando o Solaris 10.

    
por DemiSheep 18.07.2014 / 20:02

5 respostas

5

Você pode fazer um único comando tar para extrair o conteúdo desejado:

tar -zxvf path_to_file -C output_directory

Como explicado nas% man_de% páginas de manual :

-C directory, --cd directory, --directory directory

In c and r mode, this changes the directory before adding the following files. In x mode, change directories after opening the archive but before extracting entries from the archive.

Como você adicionou que está usando o Solaris , eu acho você poderia tentar:

gunzip -dc path_to_file | tar xf - -C path_to_extract
    
por 18.07.2014 / 20:25
2

Isso faz o que você quer?

tar xzvf file.tar.gz -C /target/directory
    
por 18.07.2014 / 20:25
1

No Linux moderno, você pode usar:

tar xzf /path/to/file.tar.gz -C /target/directory/

Isso é praticamente equivalente a:

(cd /target/directory/; gzip -cd /path/to/file.tar.gz|tar xf - )

Se você não estiver no Linux, verifique suas páginas de manual para as opções suportadas de suas ferramentas.

    
por 18.07.2014 / 21:34
1

Eu finalmente percebi isso ...

O comando find pode ser usado para executar qualquer comando em cada arquivo encontrado.

find . -name "*.tar" -execdir tar -vxf '{}' \; -delete

Corresponde recursivamente nomes de arquivos ( find ) no diretório atual ( . ) cujo nome corresponde à expressão regular ( -name ) qualquer coisa que termine com tar de ponto ( *.tar" ) (aspas duplas evitam bash da expansão glob * .tar - no meu teste literal, devido a circunstâncias circunvizinhas, eu tive que preceder cada citação por uma barra invertida). Em seguida, para cada arquivo correspondente, execute tar no diretório do arquivo encontrado ( -execdir tar ) com verbosidade ( -v ) e extraia os arquivos reunidos ( -x ) do arquivo tarball ( -f ) localizado por find ( '{}' ) (aspas simples impedem a interpretação de shell do nome do arquivo local) indicando que o fim da lista de parâmetros deve ser passado para tar para cada arquivo correspondente ( \; ) (barra invertida impede o entendimento do shell de ponto e vírgula) e depois diga find para excluir cada arquivo correspondente conforme indicado por um parâmetro passado para find ( -delete ).

    
por 05.02.2017 / 17:05
1

Nenhuma das outras respostas aqui menciona todas as advertências da implementação tar padrão no Solaris. Uma dessas ressalvas é que ele não suporta compactação por si só. Uma extração simples pode ser obtida através de:

gzip -dc < /path/to/the.tar.gz | tar xvf -

Além disso, se você criou o arquivo por algo como

tar cvf - /path/to/directory | gzip -c > the.tar.gz

você verá que extrair este arquivo sempre substitui os arquivos originais. Isso ocorre porque o Solaris tar não tira a entrada / das entradas do archive após a extração e não tem meios de remover os componentes do caminho. Então, se você quiser extrair uma cópia do conteúdo em segundo , você terá que criar o arquivo com um comando ligeiramente diferente:

tar cvf - -C /path/to/directory . | gzip -c > the.tar.gz

ou

(cd /path/to/directory && tar cvf - .) | gzip -c > the.tar.gz

Na implementação do Solaris, a opção -C não se aplica à extração. Supondo que o arquivo foi criado usando um desses dois métodos ou similar, uma variante desse segundo formulário permitirá a extração para um local arbitrário:

gzip -dc < the.tar.gz | (cd /path/to/extraction/point && tar xvf -)

Se você tiver o GNU tar installed ( /usr/sfw/bin/gtar ), ele suportará a compactação diretamente, bem como a remoção de caminhos. Neste caso, as opções usuais, como

/usr/sfw/bin/gtar xvzf the.tar.gz

será suficiente.

    
por 02.05.2017 / 17:24

Tags