Arquivos com nomes vazios

8

Eu estava escrevendo um widget para exibir arquivos em um determinado diretório e me perguntei se precisava cobrir o caso em que um arquivo tem um nome vazio.

Os testes não mostraram resultados óbvios, então eu queria saber se alguém tem informações definidas

$ touch ""
touch: cannot touch `': No such file or directory

$ echo > ""
bash: : No such file or directory
Johannes Schaub - litb
fonte

Respostas:

15

Um nome de arquivo pode não estar vazio. Para citar a Especificação Unix Única, §3.170 , um nome de arquivo é:

Um nome que consiste em 1 a {NAME_MAX} bytes usado para nomear um arquivo. Os caracteres que compõem o nome podem ser selecionados no conjunto de todos os valores de caracteres, exceto o caractere <slash> e o byte nulo.

Portanto, ele deve consistir em pelo menos 1 byte, ou seja, não está vazio.

Não que, a partir dessa definição, nenhum desses caracteres precise ser visível (ou seja, todos possam ser espaços em branco) nem precisam ser impressos (todos podem ser caracteres de controle). E se você estiver assumindo que os nomes de arquivos são UTF-8, eles não precisam ser.

derobert
fonte
obrigado! para que eu possa usar uma string vazia para indicar um nome de arquivo ausente no meu código. agradável
Johannes Schaub - litb
A única restrição real é que o nome não pode conter '\0'nem ASCII '/'.
precisa saber é o seguinte
@vonbrand Sim, certifiquei-me de copiar essa frase (mesmo que ela não atenda diretamente à pergunta) e depois reiterar abaixo para garantir que o OP saiba disso, pois é bastante relevante para tentar exibir nomes de arquivos. PS: Obrigado por corrigir isso na edição.
derobert
3

Eu não acho que você pode ter um arquivo sem nome. No entanto, convém manipular o caso (bastante artificial) de um nome de arquivo que consiste em nada além de espaços, que são possíveis:

$ echo "Hi" > "          "
$ echo "Bye" > "         "
$ cat "         "
Bye
$ cat "          "
Hi
Renan
fonte
2
Certa vez, tínhamos um arquivo cujo nome era a sequência de escape para "linha anterior; início da linha" mais algum lixo. Fazer um lsarquivo não estava lá, ls missingmostrou muito bem ... para extrema perplexidade do agressor.
vonbrand
1

Interessante. Parece que você pode criar nomes somente para espaços em branco, pelo menos:

$ touch " "
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Mar  5 22:57
$ file \
 : empty
Cory J
fonte
1

EDIT : ERRADO ERRADO ERRADO.

No meu caso, o nome do arquivo não estava vazio, consistia em caracteres não imprimíveis. Consulte: Como você cria um arquivo com um nome vazio?

Resposta antiga

Você deve. Não sei como, mas criei um arquivo com um nome de arquivo vazio, duvido que houvesse um espaço em branco lá:

chaouche@karabeela /mnt/ubuntu/storage $ ls
total 352K
drwx------  3 chaouche chaouche 4.0K Feb 12 11:00
drwxr-xr-x  4 chaouche chaouche 4.0K Apr 14 23:13 AUDIO
drwxr-xr-x  5 chaouche chaouche 4.0K Jul 20 22:25 BACKUPS
-rw-r--r--  1 chaouche chaouche 310K Jun 15 13:00 cv_yassine_chaouche_2012.pdf
drwxr-xr-x  2 chaouche chaouche 4.0K Jun 10 22:16 Mageia-3-i586-DVD
drwxr-xr-x  5 chaouche     1001 4.0K Oct 12  2012 MUSIQUE
drwxr-xr-x 15 chaouche chaouche 4.0K Oct 27  2012 PARISVIII
drwxr-xr-x  6 chaouche chaouche 4.0K Jun 12 18:33 SABAYON
drwxr-xr-x  5 chaouche chaouche 4.0K Jun 15 13:23 SIFTECH
drwxr-xr-x  5 chaouche chaouche 4.0K Feb  6 15:11 TOILES
drwxr-xr-x  4 chaouche chaouche 4.0K Jul 17 17:21 VIDEOS
chaouche@karabeela /mnt/ubuntu/storage $

Perguntei no #linux como remover o arquivo e uma pessoa sugeriu que eu afastei todos os outros arquivos e use a conclusão da guia, o que deu um comportamento muito interessante:

# with tab completion
chaouche@karabeela /mnt/ubuntu/storage $ ls /
total 45M
-rwxr-xr-x  1 chaouche chaouche  34M Jan 16  2013 inkscape-0.48.4-1-win32.exe
-rwxr-xr-x  1 chaouche chaouche 8.6M Feb  4 11:42 mypaint-1.0.0-win32-installer.exe
-rwxr-xr-x  1 chaouche chaouche 2.7M Jan 17  2013 pdftkb_setup.exe

# without tab completion, wrote "/" by hand
chaouche@karabeela /mnt/ubuntu/storage $ ls /
total 212K
-rw-r--r--   1 root root    0 Apr 15  2012 1
drwxr-xr-x   2 root root 4.0K Dec  9  2012 bin
drwxr-xr-x   3 root root 4.0K Jun 15 12:10 boot
-rw-------   1 root root  74K Jul  1  2011 dead.letter
drwxr-xr-x  19 root root 4.2K Jul 20 20:14 dev
drwxr-xr-x 117 root root  12K Jul 20 21:30 etc
drwxr-xr-x   4 root root 4.0K Jun 12 18:40 home
drwxr-xr-x   2 root root 4.0K Jun  8  2011 initrd
drwxr-xr-x  20 root root  12K Dec  9  2012 lib
drwx------   2 root root  16K Jun  7  2011 lost+found
drwxr-xr-x   4 root root 4.0K Jul  3 01:56 media
drwxr-xr-x   9 root root 4.0K Apr 15 00:06 mnt
drwxr-xr-x   8 root root 4.0K Jun 30 23:19 opt
dr-xr-xr-x 198 root root    0 Jun 15 13:10 proc
drwxr-x---  28 root root 4.0K Jul 20 21:42 root
drwxr-xr-x   2 root root  12K Dec  9  2012 sbin
drwxr-xr-x   2 root root 4.0K Apr  3  2011 srv
drwxr-xr-x  12 root root    0 Jun 15 13:10 sys
-rw-r--r--   1 root root    0 Jun 12 18:40 thisismageia
drwxrwxrwt  69 root root  36K Jul 20 22:04 tmp
drwxr-xr-x  14 root root 4.0K Nov  6  2011 usr
drwxr-xr-x  18 root root 4.0K Jul  2  2011 var
chaouche@karabeela /mnt/ubuntu/storage $

Se houvesse um espaço em branco no nome do arquivo, ele seria substituído por \ "" quando eu pressione a tecla tab, mas não.

ychaouche
fonte