Verifique se o arquivo é um arquivo; se sim, extrair

5

Como posso verificar se um arquivo é um arquivo e, em seguida, extraí-lo com 7z ? Eu entendo que eu poderia verificá-lo pelo comando file , mas ele não funcionará em scripts por causa de sua saída. Eu não posso prever que tipo de arquivo poderia ser. Eu só quero fazer algo como:

Can I extract it by 7z?
If yes, extract,
if not, go further

por bash sript.

    
por Michał 03.03.2018 / 14:40

3 respostas

8

O utilitário 7z retorna um código de saída diferente de zero se a operação que ele executa falhar. Você pode usar esse fato para tentar extrair o arquivo e, em seguida, fazer outra coisa se isso falhar:

if ! 7z e filename 2>/dev/null; then
    # do something else
fi

ou, dependendo do que mais você quer fazer ou não,

if 7z e filename 2>/dev/null; then
    exit
fi

# do something else

que pode ser encurtado para

7z e filename 2>/dev/null && exit

# do something else

Você pode obviamente incluir isso em

if 7z t filename; then

fi

e detectar uma falha de extração (devido a espaço insuficiente em disco ou qualquer outro erro que possa ocorrer durante a extração) separadamente de uma falha na determinação de que esse é realmente um arquivo 7z .

O código completo pode parecer

if 7z t filename 2>/dev/null; then
    if 7z e filename 2>/dev/null; then
        echo 'All is good, archive extracted' >&2
    else
        echo 'Archive failed to extract' >&2
    fi
else
    echo '7z failed to process the file' >&2
fi
    
por 03.03.2018 / 17:17
11
filename=/tmp/foo.gz

if 7z t $filename; then
    7z e $filename
else
    echo $filename not an archive.
fi
    
por 03.03.2018 / 14:53
6

Se 7z t <archive> retornar 0, o arquivo será um arquivo válido.

    
por 03.03.2018 / 14:56