Fichiers avec des noms vides

8

J'écrivais un widget pour afficher des fichiers dans un répertoire donné et je me demandais si je devais couvrir le cas où un fichier a un nom vide.

Les tests n'ont pas montré de résultats évidents, donc je me demandais si quelqu'un avait des informations précises

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

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

Réponses:

15

Un nom de fichier n'est peut-être pas vide. Pour citer la spécification Unix unique, §3.170 , un nom de fichier est:

Un nom composé de 1 à {NAME_MAX} octets utilisé pour nommer un fichier. Les caractères composant le nom peuvent être sélectionnés dans l'ensemble de toutes les valeurs de caractères à l'exclusion du caractère <slash> et de l'octet nul.

Il doit donc être composé d'au moins 1 octet, c'est-à-dire non vide.

Non pas qu'à partir de cette définition, aucun de ces caractères ne doit être visible (c.-à-d. Qu'ils pourraient tous être des espaces) ni qu'ils doivent être imprimés (pourraient tous être des caractères de contrôle). Et si vous supposez que les noms de fichiers sont UTF-8, ils n'ont pas besoin de l'être.

derobert
la source
Merci! donc je peux utiliser une chaîne vide pour indiquer un nom de fichier absent dans mon code. nice
Johannes Schaub - litb
La seule vraie restriction est que le nom ne peut pas contenir ASCII '\0'ni '/'.
vonbrand
@vonbrand Oui, je me suis assuré de copier cette phrase (même si elle ne répond pas directement à la question), puis de réitérer ci-dessous pour être sûr que OP le sait, car c'est tout à fait pertinent pour essayer d'afficher les noms de fichiers. PS: Merci d'avoir corrigé cela dans le montage.
derobert
3

Je ne pense pas que vous puissiez avoir un fichier sans nom. Cependant, vous voudrez peut-être gérer le cas (plutôt artificiel) d'un nom de fichier qui ne se compose que d'espaces, ce qui est possible:

$ echo "Hi" > "          "
$ echo "Bye" > "         "
$ cat "         "
Bye
$ cat "          "
Hi
Renan
la source
2
Nous avions une fois un fichier dont le nom était la séquence d'échappement de la "ligne précédente; début de la ligne" plus quelques ordures. Faire un lscertain dossier n'était pas là, l'a ls missingmontré très bien ... pour l'extrême perplexité de l'auteur.
vonbrand
1

Intéressant. On dirait que vous pouvez au moins faire des noms en blanc:

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

EDIT : FAUX MAUVAIS MAUVAIS.

Dans mon cas, le nom de fichier n'était pas vide, il était composé de caractères non imprimables. Voir: Comment créer un fichier avec un nom vide?

Ancienne réponse

Vous devriez. Je ne sais pas comment, mais j'ai créé un fichier avec un nom de fichier vide, je doute qu'il y ait un espace là-bas:

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 $

J'ai demandé sur #linux comment supprimer le fichier et une personne m'a suggéré de déplacer tous les autres fichiers, puis d'utiliser la complétion de l'onglet, ce qui a donné un comportement très intéressant:

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

S'il y avait un espace dans le nom de fichier, il aurait été remplacé par \ "" lorsque j'ai appuyé sur la touche de tabulation, mais ce n'est pas le cas.

ychaouche
la source