Diz-se que no Unix e Linux em geral, você deve evitar espaços no nome do arquivo (arquivo comum, dir, link, arquivo do dispositivo, ...).
Mas eu faço isso o tempo todo. Para um nome de arquivo com um espaço dentro,
- No Nautilus, o caractere de espaço é mostrado como um espaço.
- No terminal Bash, eu uso
\
para representar um espaço ou coloque o nome do arquivo dentro de um par de aspas duplas. - nos arquivos de alguns aplicativos (Nautilus, não tenho certeza se o SO também o fará), o nome do arquivo é gravado com o espaço substituído por
%20
.
Um espaço realmente não é permitido em um nome de arquivo?
Como você usa ou lida com um espaço em um nome de arquivo corretamente?
-rf ~
(usetouch -- "-rf ~"
), mas eu não o recomendaria./
separador). O uso de todos os 254 bytes restantes abre a porta para todas as maneiras de "nomes" indescritíveis. Obviamente, isso é insano, mas nem todos concordam com o que é "sã", e personagens diferentes quebram ferramentas diferentes. A interseção da sanidade de todos é bem pequena .Respostas:
Espaços, e de fato todos os caracteres, exceto
/
NUL, são permitidos nos nomes de arquivos. A recomendação de não usar espaços nos nomes de arquivos vem do perigo de que eles possam ser mal interpretados pelo software que os suporta mal. Indiscutivelmente, esse software é com erros. Mas também é possível argumentar que linguagens de programação como shell script facilitam a criação de softwares que quebram quando apresentados com nomes de arquivos com espaços neles, e esses bugs tendem a desaparecer porque os scripts de shell geralmente não são testados por seus desenvolvedores usando nomes de arquivos com espaços em eles.Os espaços substituídos por
%20
geralmente não são vistos nos nomes de arquivos. Isso é usado principalmente para URLs (da web). Embora seja verdade que a codificação% de URLs às vezes entra em nomes de arquivos, geralmente por acidente.fonte
bash
. Tentei algumas coisas, como citá-lo com Ctrl-V e algo assim,$(echo -e \\0)
mas não funcionou. O motivo é que o NUL não pode ser usado nos nomes de arquivos é que ele não pode ser usado nas strings C (porque é o terminador de strings) e todas as APIs subjacentes e praticamente todas as strings manipuladas pelos programas C usam esse formato . Comobash
está escrito em C, ele pode simplesmente não ter suporte para nenhuma string com NUL. Eu posso estar errado, pode haver alguma maneira obscura ...NUL
e bash, você precisa$'\0'
. Por exemplo:find . -print0 | while read -d $'\0' f; do echo "$f"; done
Os espaços são permitidos nos nomes de arquivos, como você observou.
Se você olhar a entrada "a maioria dos sistemas de arquivos UNIX" neste gráfico na wikipedia , você notará:
Qualquer conjunto de caracteres de 8 bits é permitido. Também podemos incluir ASCII de 7 bits nesse guarda-chuva, pois é um subconjunto de vários conjuntos de 8 bits e é sempre implementado usando bytes de 8 bits.
Os únicos caracteres proibidos são
/
e "nulos". "Nulo" refere-se a um byte zero, mas eles não são permitidos nos dados de texto.No entanto , se você fizer uso do shell, poderá perceber que existem alguns caracteres que criarão um incômodo, mais significativamente
*
, que é um operador de globos POSIX.Dependendo de como você deseja definir "aborrecimento", você pode incluir espaços em branco (espaços, guias, novas linhas etc.), pois isso cria a necessidade de citar
""
. Mas isso é inevitável, pois os espaços são permitidos, então ...Em um contexto de shell / linha de comando, coloque o nome do arquivo entre aspas simples ou duplas (mas observe que eles não são os mesmos outros problemas do WRT) ou escape dos espaços com
\
, por exemplo:fonte
touch $(echo -e "foo\00bar")
--e
processos\0N
como um valor octal, mas ainda se perde em algum lugar, pois isso apenas cria um arquivo chamadofoobar
. É claro que NULL não pode ser impresso, mas eu garanto que ele foi embora por causa da restrição da string C.foo[NULL]bar
acabaria comofoo
para a maioria das intenções e propósitos. O fato de que isso não aconteceecho -e
mostra que o NULL foi removido em algum lugar./
que é o separador de diretório e não pode ser citado, por isso pode estar em um nome de caminho mas não em um nome de arquivo).O motivo é amplamente histórico - WAY de volta à névoa de espaços de tempo não era permitido nos nomes de arquivos, portanto, os espaços eram usados como separadores de palavra-chave / nome de arquivo. Os futuros intérpretes de shell precisavam ser compatíveis reversamente com scripts antigos e, portanto, estamos presos à dor de cabeça que temos hoje.
Os desenvolvedores de processos que não precisam lidar muito com seres humanos podem facilitar muito as coisas, eliminando completamente os espaços. A Apple faz isso, o conteúdo de / System / Library / CoreServices / contém muito poucos espaços, os programas com espaços são abertos em nome do usuário e oWouldLookStrangeIfCamelCased. Caminhos semelhantes apenas para unix também evitam espaços.
(anedota um pouco relacionada: em meados dos anos 90, um drone do Windows dizia "Cite uma coisa que você pode fazer em um Mac que não posso fazer no Windows" -> "Use 12 caracteres em um nome de arquivo." -> Silêncio. também é possível nesses 12 caracteres)
fonte
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:
Isso é meio engraçado. Olhe para o meu
ls
:Agora vou espelhar este diretório:
Aqui estão
../mirror/
os conteúdos: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...
SAÍDA
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.fonte