Aqui vai uma dica rápida que irá ajudá-lo a trabalhar com vários arquivos zip na linha de comando.
Se você está em uma pasta e tem três arquivos zip nele (a.zip
, b.zip
, c.zip
) que você deseja descompactar, “sem problema”, você pensa. “Eu posso cuidar disso com um único comando.” E você rapidamente, execute o seguinte:
1 |
[gaarai@tenshi ~]$ unzip *.zip |
No entanto, ao invés de o programa descompactar cada arquivo um após o outro, você recebe o seguinte:
1 2 3 4 5 |
[gaarai@tenshi ~]$ unzip *.zip Archive: a.zip caution: filename not matched: b.zip caution: filename not matched: c.zip [gaarai@tenshi ~]$ |
Tenho certeza de que se trata não é o que você estava esperando. Eu sei que certamente não esperava isto. No entanto, este problema pode nos ajudar a compreender mais de como funciona a linha de comando.
O problema
Sempre que você usa o curinga (*
), a própria shell expandirá isso e passará os resultados para o programa em vez do programa que gerencia a expansão em si. Isso significa que nosso comando anterior foi realmente expandido para o seguinte antes de ser executado:
1 |
[gaarai@tenshi ~]$ unzip a.zip b.zip c.zip |
Novamente, isso pode não parecer estranho, já que outros programas (tal comomkdir
, chmod
, etc) pode levar um ou mais argumentos e repetir o processo para cada um. No entanto, unzip é diferente e, na verdade, tem uso para os argumentos adicionais. Se você especificar argumentos adicionais após o nome do arquivo zip, o Unzip tentará apenas extrair esses arquivos específicos do arquivo em vez de todos os arquivos.
O comando anterior para descompactar que deveria extrair b.zip
e c.zip
de dentro do arquivo a.zip
. Como esses arquivos não existem dentro a.zip
, obtemos o resultado de erro inesperado visto anteriormente.
Você pode pensar que você terá que descompactar manualmente cada arquivo um por vez, mas você estaria errado.
A solução
Apenas porque o shell expande caracteres curinga automaticamente não significa que os programas não podem também. A solução simples para este problema é citar o argumento para evitar que o shell a interprete:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[gaarai@tenshi ~]$ unzip '*.zip' Archive: c.zip creating: c/ inflating: c/test.txt Archive: a.zip creating: a/ inflating: a/test.txt Archive: b.zip creating: b/ inflating: b/test.txt 3 archives were successfully processed. |
1 |
[gaarai@tenshi ~]$ |
Isso é tudo aí. Eu vi soluções de loops de codificação no script bash para encontrar correndo combinado com xargs, mas nada disso é necessário. Basta deixar o próprio comando de descompactar-se cuidar das coisas para você.
Fonte: https://chrisjean.com/unzip-multiple-files-from-linux-command-line/