A resposta curta à sua pergunta é que * (lista de padrões) corresponderá a zero ou mais ocorrências dos padrões fornecidos. Existem zero instâncias do caractere Unicode 0001 entre cada um dos bytes de entrada. Portanto, a operação de substituição substitui cada uma dessas ocorrências zero por um único espaço.
Talvez você quisesse fazer isso:
$ for str in $'\t' "ab" ळ ; do
printf -- '%s' "${str//+($'\x01')/ }" |xxd
done)
0000000: 09 .
0000000: 6162 ab
0000000: e0a4 b3 ...
Mas a resposta mais longa é que, em qualquer caso, nomes de caminho não são texto. Pelo menos, eles não estão tão longe quanto o sistema operacional (semelhante ao Unix) está em causa. Eles são seqüências de bytes. O problema é que coisas assim são triviais:
$ LC_ALL=latin1
$ mkdir 'áñ' && cd 'áñ'
$ LC_ALL=ga_IE.iso885915@euro
$ mkdir '€25' && cd '€25'
$ LC_ALL=zh_TW
$ pwd
# ... what should the output be? And what about the output of:
$ /bin/pwd
Cada uma dessas localidades inclui caracteres que não existem nos outros. Esse problema afeta coisas como locate -r e localizar -regex também; o argumento de locate -r é uma expressão regular que, portanto, deve incluir suporte para coisas como classes de caracteres; mas você não sabe qual localidade usar para determinar as classes de caracteres para os caracteres nos nomes de caminho ou mesmo se houver um único local utilizável que possa ser usado para representar todos os caminhos no sistema.