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)
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
tar
em algum lugar que suporte isso -M
que tar
sugeriu para mim quando tentei tar -zxv -f a.tgz -f b.tgz
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.
for file in *.tar.gz; do tar -zxf $file; done
for file in *.tar.bz2; do tar -jxf $file; done
for file in *.tar.xz; do tar -Jxf $file; done
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
find . -name "*.tar.gz" -exec tar xzf {} \;
Tags tar