Fiquei me perguntando se (e, claro, como) é possível dizer tar
para extrair vários arquivos em uma única execução.
Sou um usuário experiente do Unix há vários anos e, claro, sei que você pode usar uma for
ou mais find
coisas assim para chamar tar
uma vez para cada arquivo que deseja extrair, mas não consegui criar uma linha de comando que causasse a minha tar
para extrair dois arquivos .tar.gz de uma só vez. (E não, não há nada errado for
, estou apenas perguntando se é possível ficar sem.)
Estou fazendo essa pergunta por curiosidade, talvez
- há um garfo estranho em
tar
algum lugar que suporta isso - alguém sabe como usar o
-M
parâmetro quetar
me sugeriu quando tenteitar -zxv -f a.tgz -f b.tgz
- somos todos cegos e é totalmente fácil de fazer - mas não consegui encontrar nenhuma dica na web que não utilizasse
for
oufind
ou algoxargs
parecido.
Por favor, não responda com tar -zxvf *.tar.gz
(porque isso não funciona) e apenas responda com "não funciona" se tiver certeza absoluta sobre isso (e talvez também tenha uma boa explicação sobre o motivo ).
Edit: Fui apontado para uma resposta a esta pergunta no Stack Overflow, que diz detalhadamente que não é possível sem quebrar a tar
sintaxe atual , mas 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 quebrar nenhuma sintaxe existente, imho.
-M
parâmetroRespostas:
Isso é possível, a sintaxe é bem fácil:
A opção -i ignora o EOF no final dos arquivos tar, na página de manual:
fonte
cat *.tar.bz2 | tar -ixjv
. Obrigado!para * .tar.gz
para * .tar.bz2
para * .tar.xz
fonte
$file
se seus arquivos tiverem nomes com espaços.Você precisa usar um loop. Não quebraria a
tar
sintaxe da linha de comando para permitir várias-f
opções, mas exigiria a adição de código para processar vários arquivos em sequência, com todos os tipos de condições de borda (o que acontece se um arquivo no meio estiver malformado? Os arquivos podem usar diferentes mecanismos de compactação? Você também pode ter várias-C
opções (opção tar GNU para extrair para um diretório específico)? E quanto a -K (opção tar tar GNU para iniciar com um determinado nome de membro)?…).Uma possibilidade de evitar um
for
loop é instalar e ativar o AVFS , um sistema de arquivos FUSE que fornece acesso transparente aos arquivos. Cada arquivo/path/to/archive
dobrado como um diretório~/.avfs/path/to/archive#
. Se você deseja combinar os arquivos com caracteres curinga, há um obstáculo em adicioná-lo#
a uma correspondência curinga; isso pode ser feito no zsh.fonte
find . -name "*.tar.gz" -exec tar xzf {} \;
fonte