Se você quiser agnóstico do SO, não existe uma "extensão de nome de arquivo". Certos sistemas operacionais podem, na verdade, usá-los para determinar o programa para abrir um arquivo, ou até mesmo ir tão longe quanto explicitamente restringi-los (pense em FAT com 3 caracteres no máximo).
Mas as informações também podem ser coletadas de números mágicos ou outras heurísticas. Extensões de nome de arquivo são apenas metadados - onde os dados são armazenados não importam do ponto de vista do sistema operacional. Por exemplo, no * nix, um arquivo de script inclui um shebang na parte superior do arquivo. O shebang informa com qual interpretador o arquivo deve ser executado, por exemplo, /bin/bash ou /usr/bin/env ruby , etc.
No mundo * nix, um "nome-base" é apenas o nome do arquivo com quaisquer componentes principais (ou seja, caminhos incluindo o último / ) removidos. Assim, o nome de base de .txt seria .txt . E o nome de base de /usr/bin/foo seria foo .
Os arquivos que começam com pontos são chamados de dotfiles . Eles não são de modo algum especiais além dos sistemas operacionais do tipo Unix que devem estar ocultos das listagens de diretório por padrão. Seu nome de base é seu nome completo, portanto, .bashrc é realmente chamado de .bashrc . Um dotfile não possui uma extensão, por si só.
Além disso, você pode tentar extrair uma extensão, que seriam os componentes de nome de base completos a partir do último ponto encontrado, por exemplo, foo.tar.gz seria obviamente um arquivo .gz e não um .tar.gz . Somente quando descompactado com o gzip, ele se torna um foo.tar , que seria descompactado pelo tar. E assim por diante.