Eu acho que você vai querer usar uma declaração case
para escolher como descompactar o arquivo de entrada com base no nome do arquivo (ou talvez usar file
para basear-se no conteúdo). Descompacte o arquivo de entrada em um diretório temporário, piping stdout / stdin para / dev / null ou um arquivo. Em seguida, execute zip
no conteúdo do diretório temporário, salvando em um nome de arquivo fornecido na linha de comando. Remova o diretório temporário.
Algo parecido com isto (UNTESTED):
infile="$1"
outfile="$2"
# Add syntax checking here
tempdir='mktemp -d'
case "$infile" in
*.tar.gz)
tar -C "$tempdir" -xzf "$infile" 2>/dev/null
;;
*.tar)
tar -C "$tempdir" -xf "$infile" 2>/dev/null
;;
... # Add handling for other input formats here
*)
echo "Unrecognized input format" >&2
false
;;
esac
if [ $? -ne 0 ]; then
echo "Error processing input file $infile" >&2 # or just echo "error"
rm -rf "$tempdir"
exit 1
fi
(cd "$tempdir" && zip "$outfile" .)
rm -rf "$tempdir"
Você precisará determinar quais erros receberá do tar, etc., quando ocorrer "criptografado" e atualize as mensagens de erro adequadamente para corresponder ao depois de. Mas isso deve lhe dar um ponto de partida razoável.