No Linux / Unix, há o comando file
. Ele examinará os dados e, em seguida, fará uma suposição sobre o tipo de arquivo que é. Se houver um número limitado de arquivos diferentes, você poderá escrever um script de wrapper que acrescente a extensão com base no conteúdo do arquivo. Exemplo rápido para entender a ideia:
#!/bin/bash
filename=$1
filedata='file $filename'
if [[ $filedata =~ /gzip/ ]];
mv $filename ${filename}.gz
exit
fi
if [[ $filedata =~ /PDF document/ ]];
mv $filename ${filename}.pdf
exit
fi