Файлы с пустыми именами

8

Я писал виджет для отображения файлов в данном каталоге, и мне было интересно, нужно ли мне охватить случай, когда файл имеет пустое имя.

Тестирование показало неочевидные результаты, поэтому мне было интересно, есть ли у кого-то определенная информация

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

$ echo > ""
bash: : No such file or directory
Йоханнес Шауб - Литб
источник

Ответы:

15

Имя файла не может быть пустым. Чтобы процитировать Единую Спецификацию Unix, §3.170 , имя файла:

Имя, состоящее из 1 до {NAME_MAX} байтов, используемых для именования файла. Символы, составляющие имя, могут быть выбраны из набора всех значений символов, кроме символа <slash> и нулевого байта.

Таким образом, он должен состоять как минимум из 1 байта, т. Е. Не быть пустым.

Не то чтобы из этого определения ни один из этих символов не должен быть видимым (т. Е. Все они могут быть пробелами), а также не должен печатать (все они могут быть управляющими символами). И если вы предполагаете, что имена файлов UTF-8, они не должны быть.

derobert
источник
Спасибо! поэтому я могу использовать пустую строку для обозначения отсутствующего имени файла в моем коде. хороший
Йоханнес Шауб - Lit
Единственным реальным ограничением является то, что имя не может содержать '\0'ни ASCII, ни '/'.
vonbrand
@vonbrand Да, я удостоверился, что скопировал это предложение (даже если оно не касается непосредственно вопроса), а затем еще раз повторил, чтобы убедиться, что OP знает это, поскольку это весьма уместно для попытки отобразить имена файлов. PS: Спасибо за исправление в редактировании.
Дероберт
3

Я не думаю, что вы можете иметь файл без имени. Однако вы можете захотеть обработать (довольно надуманный) случай имени файла, который состоит только из пробелов, что возможно:

$ echo "Hi" > "          "
$ echo "Bye" > "         "
$ cat "         "
Bye
$ cat "          "
Hi
Ренан
источник
2
Когда-то у нас был файл, чье имя было escape-последовательностью для «предыдущая строка; начало строки» плюс некоторый мусор. Делать какой- lsто файл там не было, ls missingпоказало это просто ... для крайнего недоумения преступника.
vonbrand
1

Интересно. Похоже, вы можете делать только пробельные имена:

$ touch " "
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Mar  5 22:57
$ file \
 : empty
Кори Дж
источник
1

РЕДАКТИРОВАТЬ : НЕПРАВИЛЬНО НЕПРАВИЛЬНО.

В моем случае имя файла не было пустым, оно состояло из непечатаемых символов. Смотрите: Как вы создаете файл с пустым именем?

Старый ответ

Вам следует. Я не знаю как, но я создал файл с пустым именем, я сомневаюсь, что там были пробелы:

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 $

Я спросил на #linux, как удалить файл, и один человек предложил мне убрать все остальные файлы, а затем использовать завершение вкладки, что дало очень интересное поведение:

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

Если бы в имени файла был пробел, он был бы заменен на \ "", когда я нажал клавишу Tab, но это не так.

ychaouche
источник