Extrai vários arquivos .tar.gz com uma única chamada tar

33

Eu queria saber se (e, claro, como) é possível dizer a tar para extrair vários arquivos em uma única execução.

Sou um usuário experiente de Unix há vários anos e, claro, sei que você pode usar for ou find ou coisas assim para chamar tar uma vez para cada arquivo que você deseja extrair, mas eu crie uma linha de comando que fez com que meu tar extraísse dois arquivos .tar.gz de uma só vez. (E não, não há nada de errado com for , estou apenas perguntando se é possível passar sem isso.)

Estou fazendo essa pergunta, não por curiosidade, talvez

  • há um fork estranho de tar em algum lugar que suporte isso
  • alguém sabe como usar o parâmetro -M que tar sugeriu para mim quando tentei tar -zxv -f a.tgz -f b.tgz
  • somos todos cegos e é totalmente fácil de fazer, mas não encontramos nenhuma dica na Web que não utilizasse for ou find ou xargs ou algo semelhante.

Por favor, não responda com tar -zxvf *.tar.gz (porque isso faz não funcionar) e apenas responda com "não funciona" se tiver certeza absoluta (e talvez tenha uma boa explicação por que , também).

Editar: fui apontado para uma resposta a esta pergunta no Stack Overflow que diz em detalhes que não é possível sem quebrar a atual sintaxe tar , mas eu não acho que isso seja verdade. Usar tar -zxv -f a.tgz -f b.tgz ou tar -zxv --all-args-are-archives *.tar.gz não quebraria nenhuma sintaxe existente, imho.

    
por scy 31.08.2011 / 17:36

4 respostas

36

Isso é possível, a sintaxe é bem fácil:

$ cat *.tar | tar -xvf - -i

A opção -i ignora o EOF no final dos arquivos tar, da página man:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
    
por 31.08.2011 / 20:47
23

para * .tar.gz

for file in *.tar.gz; do tar -zxf $file; done

para * .tar.bz2

for file in *.tar.bz2; do tar -jxf $file; done

para * .tar.xz

for file in *.tar.xz; do tar -Jxf $file; done
    
por 04.03.2015 / 18:26
2

Você precisa usar um loop. Não quebraria a sintaxe da linha de comando tar para permitir várias opções -f , mas exigiria a adição de código para processar vários arquivos em seqüência, com todos os tipos de condições de borda (O que acontece se um arquivo morto estiver malformado? "Os arquivos podem usar diferentes mecanismos de compactação? Você pode ter várias opções -C (opção GNU tar para extrair para um diretório específico) também? E sobre -K (opção de tar GNU para iniciar em um determinado nome de membro)? ...) .

Uma possibilidade de evitar um loop for é instalar e ativar o AVFS , um FUSE que fornece acesso transparente aos arquivos. Cada arquivo /path/to/archive dobra como um diretório ~/.avfs/path/to/archive# . Se você quiser corresponder os arquivos com curingas, há um obstáculo ao adicionar esse # a uma correspondência de caractere curinga; isso pode ser feito em zsh.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination
    
por 01.09.2011 / 01:56
-1

find . -name "*.tar.gz" -exec tar xzf {} \;

    
por 21.05.2018 / 14:20

Tags