Archivos con nombres vacíos

8

Estaba escribiendo un widget para mostrar archivos en un directorio determinado y me preguntaba si necesitaba cubrir el caso en que un archivo tiene un nombre vacío.

Las pruebas no mostraron resultados obvios, así que me preguntaba si alguien tiene información definitiva

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

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

Respuestas:

15

Un nombre de archivo puede no estar vacío. Para citar la especificación Single Unix, §3.170 , un nombre de archivo es:

Un nombre que consta de 1 a {NAME_MAX} bytes utilizados para nombrar un archivo. Los caracteres que componen el nombre pueden seleccionarse del conjunto de todos los valores de caracteres, excluyendo el carácter <slash> y el byte nulo.

Por lo tanto, debe constar de al menos 1 byte, es decir, no está vacío.

No es que a partir de esa definición, ninguno de esos caracteres necesite ser visible (es decir, podría ser un espacio en blanco) ni tampoco debe imprimirse (todos podrían ser caracteres de control). Y si está asumiendo que los nombres de archivo son UTF-8, no es necesario que lo sean.

derobert
fuente
¡Gracias! entonces puedo usar una cadena vacía para denotar un nombre de archivo ausente en mi código. agradable
Johannes Schaub - litb
La única restricción real es que el nombre no puede contener ASCII '\0'ni '/'.
vonbrand
@vonbrand Sí, me aseguré de copiar esa oración (aunque no aborda directamente la pregunta) y luego reitero debajo para asegurarme de que OP lo sepa, ya que es bastante relevante para tratar de mostrar los nombres de los archivos. PD: Gracias por arreglar eso en la edición.
derobert
3

No creo que puedas tener un archivo sin nombre. Sin embargo, es posible que desee manejar el caso (más bien artificial) de un nombre de archivo que consta de nada más que espacios, que son posibles:

$ echo "Hi" > "          "
$ echo "Bye" > "         "
$ cat "         "
Bye
$ cat "          "
Hi
Renan
fuente
2
Una vez tuvimos un archivo cuyo nombre era la secuencia de escape para "línea anterior; inicio de línea" más algo de basura. Hacer un lsarchivo no estaba allí, lo ls missingdemostró bien ... por desconcierto extremo del autor.
vonbrand
1

Interesante. Parece que puedes hacer nombres de espacios en blanco al menos:

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

EDITAR : INCORRECTO INCORRECTO INCORRECTO.

En mi caso, el nombre del archivo no estaba vacío, consistía en caracteres no imprimibles. Ver: ¿Cómo se crea un archivo con un nombre vacío?

Vieja respuesta

Debieras. No sé cómo, pero creé un archivo con un nombre de archivo vacío, dudo que haya un espacio en blanco allí:

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 $

Le pregunté a #linux cómo eliminar el archivo y una persona sugirió que quitara todos los demás archivos y luego usara la pestaña de finalización, lo que dio un comportamiento muy interesante:

# 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 $

Si hubiera un espacio en blanco en el nombre del archivo, habría sido reemplazado por \ "" cuando presioné la tecla de tabulación, pero no fue así.

ychaouche
fuente