Dateien mit leeren Namen


8

Ich habe ein Widget zum Anzeigen von Dateien in einem bestimmten Verzeichnis geschrieben und mich gefragt, ob ich den Fall abdecken muss, in dem eine Datei einen leeren Namen hat.

Tests zeigten keine offensichtlichen Ergebnisse, daher habe ich mich gefragt, ob jemand bestimmte Informationen hat

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

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

Antworten:


15

Ein Dateiname darf nicht leer sein. Um die Single Unix Specification, §3.170 , zu zitieren , lautet ein Dateiname:

Ein Name, der aus 1 bis {NAME_MAX} Bytes besteht, die zum Benennen einer Datei verwendet werden. Die Zeichen, aus denen der Name besteht, können aus dem Satz aller Zeichenwerte mit Ausnahme des Zeichens <Slash> und des Nullbytes ausgewählt werden.

Es muss also aus mindestens 1 Byte bestehen, dh nicht leer.

Nicht, dass nach dieser Definition keines dieser Zeichen sichtbar sein muss (dh alle Leerzeichen sein könnten), noch müssen sie gedruckt werden (könnten alle Steuerzeichen sein). Und wenn Sie davon ausgehen, dass die Dateinamen UTF-8 sind, müssen sie es nicht sein.


Vielen Dank! Daher kann ich eine leere Zeichenfolge verwenden, um einen fehlenden Dateinamen in meinem Code zu kennzeichnen. nett
Johannes Schaub - litb

Die einzige wirkliche Einschränkung ist, dass der Name weder ASCII '\0'noch ASCII enthalten kann '/'.
vonbrand

@vonbrand Ja, ich habe dafür gesorgt, dass dieser Satz kopiert wird (obwohl er die Frage nicht direkt anspricht) und dann darunter wiederholt, um sicherzugehen, dass OP das weiß, da es für den Versuch, Dateinamen anzuzeigen, sehr relevant ist. PS: Danke, dass du das in der Bearbeitung behoben hast.
Derobert

3

Ich glaube nicht, dass Sie eine Datei ohne Namen haben können. Möglicherweise möchten Sie jedoch den (eher erfundenen) Fall eines Dateinamens behandeln, der nur aus Leerzeichen besteht, die möglich sind:

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

2
Wir hatten einmal eine Datei, deren Name die Escape-Sequenz für "vorherige Zeile; Zeilenanfang" plus etwas Müll war. Eine lsDatei zu machen war nicht da, hat ls missinges gut gezeigt ... für extreme Verwirrung des Täters.
vonbrand

1

Interessant. Sieht so aus, als könnten Sie zumindest nur Leerzeichen verwenden:

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

1

EDIT : FALSCH FALSCH FALSCH.

In meinem Fall war der Dateiname nicht leer, sondern bestand aus nicht druckbaren Zeichen. Siehe: Wie erstellen Sie eine Datei mit einem leeren Namen?

Alte Antwort

Du solltest. Ich weiß nicht wie, aber ich habe eine Datei mit einem leeren Dateinamen erstellt. Ich bezweifle, dass dort ein Leerzeichen vorhanden war:

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 $

Ich habe unter #linux gefragt, wie die Datei entfernt werden soll, und eine Person hat vorgeschlagen, alle anderen Dateien zu verschieben und dann die Tab-Vervollständigung zu verwenden, was ein sehr interessantes Verhalten ergab:

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

Wenn der Dateiname ein Leerzeichen enthält, wird es durch "" ersetzt, wenn ich die Tabulatortaste drücke, aber dies ist nicht der Fall.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.