Então, sim, como afirmado várias vezes em outros lugares, um nome de arquivo pode conter praticamente qualquer caractere. Mas é preciso dizer que um nome de arquivo não é um arquivo. Ele tem algum peso como atributo de arquivo, na medida em que você normalmente precisa de um nome de arquivo para abrir um arquivo, mas o nome de um arquivo apenas aponta para o arquivo real. É um link, armazenado no diretório que o gravou, ao lado do número do inode - que é uma aproximação muito mais próxima de um arquivo real .
Então, você sabe, chame como quiser. O kernel não se importa - todas as referências de arquivo que ele manipulará lidarão com números de inode reais de qualquer maneira. O nome do arquivo é coisa para humanos consumo - se você quer torná-lo louco, bem, é o seu sistema de arquivos. Aqui, eu vou fazer algumas coisas loucas:
Primeiro, vou criar 20 arquivos e nomeá-los com nada além de espaços, cada nome de arquivo contendo mais um espaço que o anterior:
until [ $((i=$i+1)) -gt 20 ]
do v=$v' ' && touch ./"$v"
done
Isso é meio engraçado. Olhe para o meu ls
:
ls -d ./*
./ ./ ./ ./ ./
./ ./ ./ ./ ./
./ ./ ./ ./ ./
./ ./ ./ ./ ./
Agora vou espelhar este diretório:
set -- * ; mkdir ../mirror
ls -i1qdU -- "$@" |
sh -c 'while read inum na
do ln -T "$1" ../mirror/$inum
shift ; done' -- "$@"
ls -d ../mirror/*
Aqui estão ../mirror/
os conteúdos:
../mirror/423759 ../mirror/423764 ../mirror/423769 ../mirror/423774
../mirror/423760 ../mirror/423765 ../mirror/423770 ../mirror/423775
../mirror/423761 ../mirror/423766 ../mirror/423771 ../mirror/423776
../mirror/423762 ../mirror/423767 ../mirror/423772 ../mirror/423777
../mirror/423763 ../mirror/423768 ../mirror/423773 ../mirror/423778
Ok, mas talvez você esteja perguntando - mas que bom é isso? Como você pode dizer qual é qual? Como você pode ter certeza de vincular o número do inode certo ao nome do arquivo certo?
Bem...
echo "heyhey" >>./' '
tgt=$(ls -id ./' ')
cat ../mirror/${tgt%% .*} \
$(ls -1td ../mirror/* | head -n1)
SAÍDA
heyhey
heyhey
Veja, o número do inode contido ../mirror/"${tgt%% .*}"
e o referenciado ./' '
referem-se ao mesmo arquivo. Eles descrevem o mesmo arquivo. Eles o nomeiam, mas nada mais. Na verdade, não há mistério, apenas alguns inconvenientes que você pode causar, mas que acabará por ter pouco ou nenhum efeito na operação do seu sistema de arquivos unix no final.