for file in *.7z; do
directory=${file/%.7z/}
if mkdir ${directory}; then
( cd ${directory}; 7z x ../${file} )
else
echo "Unable to create directory ${directory} for archive ${file}" 1>&2
fi
done
A maneira como isso funciona é a primeira iteração em todos os arquivos *.7z
usando a variável file
. Uma vez que ele pega um nome de arquivo, ele usa manipulação de string bash para retirar o .7z
do final, e fazer uma nova variável, directory
, fora disso.
Ele então tentará criar o diretório e, se puder, abrirá um subshell, entrará nesse diretório e extrairá o arquivo 7zip.
Se não foi possível criar esse diretório, uma mensagem será enviada para o erro padrão.
Eu uso um subshell para não ter que me preocupar em perder o controle de onde estou com as alterações no diretório de trabalho.
A parte mais obscura disso é essa linha:
diretório = $ {file /%. 7z /}
Esta é a manipulação de string bash mencionada anteriormente, que procurará .7z
no final de uma string e, se presente, substitua-a por nada. Se eu quisesse substituí-lo por, digamos, .zip
, eu poderia usar ${file/%.7z/.zip}
.