descompacte dois tipos diferentes de extensões de arquivo

2

Note aqui, .zip e .jar é apenas um exemplo, minhas extensões de arquivo são diferentes. Suponha que eu tenha um diretório que possa conter o número de arquivos zip

a.zip b.zip c.zip

E / OU

z.jar x.jar y.jar

junto com outros conteúdos.

Eu quero descompactar todos eles.

Eu tentei

unzip -q *.zip

e

unzip -q *.jar

Mas quando a pasta não contém arquivos .jar, o segundo comando falha

unzip:  cannot find or open *.jar, *.jar.zip or *.jar.ZIP.

No zipfiles found.

Isso é problemático para mim, pois é um erro que meu script sairia. Eu quero descompactar silenciosamente o * .zip e * .jar sem erros. Existe alguma maneira de conseguir isso?

    
por Senthil Kumaran 09.11.2012 / 03:33

1 resposta

6

Sim, você pode usar nullglob no bash:

$ shopt -s nullglob
$ tee foo.zip bar.zip </dev/null
$ echo *.zip *.jar
bar.zip foo.zip

A opção nullglob altera o comportamento de um glob não-correspondente de se tornar uma string literal para ser removido completamente.

No entanto, isso provavelmente não será suficiente em seu caso de uso específico, já que unzip não saberá o que fazer se não for passado nenhum argumento. Você deve verificar se há zips / jars para descompactar primeiro, assim:

shopt -s nullglob
zips=( *.zip )
jars=( *.jar )
(( "${#zips[@]}" )) && unzip -q "${zips[@]}"
(( "${#jars[@]}" )) && unzip -q "${jars[@]}"

Ou de uma só vez (se aplicável):

shopt -s nullglob
zipsandjars=( *.zip *.jar )
(( "${#zipsandjars[@]}" )) && unzip -q "${zipsandjars[@]}"

No shell POSIX, algo semelhante também pode ser feito da seguinte forma:

for file in *.zip *.jar; do
    if [ "$file" != "*.zip" ] && [ "$file" != "*.jar" ]; then
        unzip -q "$file"
    fi
done
    
por 09.11.2012 / 03:36