Esse limite é por diretório, não para todo o sistema de arquivos, então você pode contorná-lo subdividindo ainda mais as coisas. Por exemplo, em vez de ter todos os subdiretórios do usuário no mesmo diretório, divida-os pelos dois primeiros caracteres do nome para que você tenha algo como:
top_level_dir
|---aa
| |---aardvark1
| |---aardvark2
|---da
| |---dan
| |---david
|---do
|---don
Melhor ainda seria criar alguma forma de hash dos nomes e usar isso para a divisão. Dessa forma, você obterá uma melhor distribuição entre os diretórios em vez de, com o exemplo das letras iniciais, "da" sendo muito completo e "zz" completamente vazio. Por exemplo, se você pegar o CRC ou MD5, o nome e usar os primeiros 8 bits, você terá algo como:
top_level_dir
|---00
| |---some_username
| |---some_username
|---01
| |---some_username
...
|---FF
| |---some_username
Isso pode ser estendido para outras profundidades conforme necessário, por exemplo, assim, se usar o nome de usuário, não um valor de hash:
top_level_dir
|---a
| |---a
| |---aardvark1
| |---aardvark2
|---d
|---a
| |---dan
| |---david
|---o
|---don
Esse método é usado em muitos lugares, como o cache do squid, para copiar o exemplo de Ludwig e os caches locais dos navegadores da web.
Uma coisa importante a notar é que com o ext2 / 3 você começará a atingir problemas de performance antes de chegar perto do limite de 32.000, pois os diretórios são procurados linearmente. Movendo para outro sistema de arquivos (ext4 ou reiser, por exemplo) irá remover essa ineficiência (reiser pesquisa diretórios com um algoritmo binário dividido, assim diretórios longos são manipulados com muito mais eficiência, ext4 também pode fazer) assim como o limite fixo por diretório.