File con nomi vuoti


8

Stavo scrivendo un widget per visualizzare i file in una determinata directory e mi chiedevo se dovevo coprire il caso in cui un file ha un nome vuoto.

I test non hanno mostrato risultati ovvi, quindi mi chiedevo se qualcuno avesse informazioni precise

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

$ echo > ""
bash: : No such file or directory

Risposte:


15

Un nome file potrebbe non essere vuoto. Per citare la specifica Unix singola, §3.170 , un nome file è:

Un nome composto da 1 a {NAME_MAX} byte utilizzato per denominare un file. I caratteri che compongono il nome possono essere selezionati dall'insieme di tutti i valori dei caratteri, esclusi il carattere <slash> e il byte null.

Quindi, deve essere costituito da almeno 1 byte, ovvero non vuoto.

Non che da quella definizione, nessuno di quei caratteri debba essere visibile (cioè potrebbe essere tutto uno spazio bianco) e non devono nemmeno essere stampati (potrebbero essere tutti caratteri di controllo). E se stai assumendo che i nomi dei file siano UTF-8, non devono esserlo.


Grazie! così posso usare una stringa vuota per indicare un nome di file assente nel mio codice. bello
Johannes Schaub - litb

L'unica vera limitazione è che il nome non può contenere '\0'né ASCII né '/'.
vonbrand

@vonbrand Sì, mi sono assicurato di copiare quella frase (anche se non affronta direttamente la domanda) e quindi ripeterlo di seguito per essere sicuro che OP lo sappia, in quanto è abbastanza rilevante per provare a visualizzare i nomi dei file. PS: Grazie per averlo risolto nella modifica.
derobert

3

Non penso che tu possa avere un file senza un nome. Tuttavia, potresti voler gestire il caso (piuttosto inventato) di un nome file che non è altro che spazi, che sono possibili:

$ echo "Hi" > "          "
$ echo "Bye" > "         "
$ cat "         "
Bye
$ cat "          "
Hi

2
Una volta avevamo un file il cui nome era la sequenza di escape per "riga precedente; inizio riga" più un po 'di spazzatura. Fare un lsfile non c'era, lo ls missingmostrò bene ... per l'estrema perplessità dell'autore.
vonbrand

1

Interessante. Sembra che tu possa fare almeno nomi solo per spazi bianchi:

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

1

EDIT : SBAGLIATO SBAGLIATO SBAGLIATO.

Nel mio caso il nome file non era vuoto, consisteva in caratteri non stampabili. Vedi: Come si crea un file con un nome vuoto?

Vecchia risposta

Dovresti. Non so come, ma ho creato un file con un nome file vuoto, dubito che ci fosse uno spazio bianco 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 $

Ho chiesto a #linux come rimuovere il file e una persona mi ha suggerito di spostare tutti gli altri file e quindi utilizzare il completamento della scheda, che ha dato un comportamento molto 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 nel nome del file fosse presente uno spazio bianco, sarebbe stato sostituito da \ "" quando ho premuto il tasto Tab, ma non è stato così.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.