Descompactando um lote de arquivos

33

Quando eu tento

 unzip filename.zip

funciona. No entanto, preciso descompactar uma série de arquivos zip.

Por que são:

 find . -name "*.zip" -print0 | xargs -0 unzip

ou

 ls *.zip | xargs unzip

não está funcionando?

Nos dois casos, recebo a mensagem "cuidado: o nome do arquivo não corresponde:".

jeannoburto
fonte

Respostas:

48

Você pode emitir o comando:

$ unzip '*.zip'

Olhe aqui para referência .

vfbsilva
fonte
Eu não disse isso claramente, mas eles não estão todos no mesmo diretório. Então, eu preciso da saída do find.
Jeannoburto
4
Obrigado. Isso pode corresponder perfeitamente à pergunta real, mas isso resolveu meu problema. Eu estava tentando unzip *e ele retornava caution: filename not matchedpara todos os arquivos, mas unzip '*.zip'fez o trabalho.
194 Ivan Ivan
27

Seus comandos não estão funcionando porque eles colocam todos os arquivos na mesma linha de comando. Embora isso funcione com a maioria dos programas, unzipo primeiro argumento será o arquivo zip, e o primeiro será o arquivo extraído. Você precisa executar o comando uma vez para cada arquivo:

find . -name "*.zip" -print0 | xargs -0 -n1 unzip

Ou

find . -name '*.zip' -exec unzip {} \;
Kevin
fonte
O segundo parece ser melhor caso haja realmente muitos arquivos. (Caso contrário, queixou-se de que o comando é muito longo com xargs) #
1115
5

No bash, você também pode fazer o seguinte:

for i in *.zip; do
    unzip "$i"
done

Também unzippode usar a -dopção para que você possa direcionar a saída para diferentes locais.

Por exemplo:

uzdir=/path/to/unzips
for i in *.zip; do
    [ -d "$uzdir/$i" ] || mkdir -p "$uzdir/$i"
    unzip "$i" -d "$uzdir/$i"
done
slm
fonte
1

Existe uma solução muito mais fácil do que as de loop fornecidas acima, use o -dsinalizador de diretório :

unzip -o somefiles.zip -d $directoryPath
Aditya Mittal
fonte
-despecifica o diretório para extrair, não o diretório para procurar arquivos.
LegendaryDude