Quando você faz for f in data/* , a enumeração de nomes de arquivos está sendo feita pelo seu shell e não "ls". Normalmente, os shells classificarão lexicograficamente (o bash faz), mas eles podem usar sua ordem de seqüência de intercalação LC_COLLATE. Talvez sua concha em particular não seja ordenada.
As entradas de diretório geralmente não são classificadas, mas dependem do sistema de arquivos subjacente. Use ls -f para listar um diretório sem classificação.
Quando você diz ls * , primeiro o shell expande * e pode classificar o resultado, então ls ordenará os nomes dos arquivos novamente.