This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D1%8F_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0 | |
<pre> | |
Запрещённые символы | |
Многие операционные системы запрещают использование некоторых служебных символов. | |
Запрещённые символы Windows (в различных версиях): | |
— разделитель подкаталогов | |
/ — разделитель ключей командного интерпретатора | |
: — отделяет букву диска или имя альтернативного потока данных | |
* — заменяющий символ (маска «любое количество любых символов») | |
? — заменяющий символ (маска «один любой символ») | |
» — используется для указания путей, содержащих пробелы | |
< — перенаправление ввода | |
> — перенаправление вывода | |
| — обозначает конвейер | |
+ — (в различных версиях) конкатенация | |
Частично запрещённые символы Windows: | |
пробел — не допускается в конце имени файла; | |
. — не допускается в конце имени файла кроме имён каталогов, состоящих из точек и доступа с префиксом «\?». | |
Символы, вызывающие проблемы в широко распространённых компонентах: | |
% — в Windows используется для подстановки переменных окружения в интерпретаторе команд, вызывает проблемы при открытии файла через стандартный диалог открытия файла; | |
! — в Windows используется для подстановки переменных окружения в интерпретаторе команд, в bash используется для доступа к истории[1]; | |
@ — в интерпретаторах команд вызывает срабатывание функций, предназначенных для почты. | |
В именах файлов UNIX и некоторых UNIX-подобных ОС запрещен слеш (/) — разделитель подкаталогов — и символ конца C-строки (). Перечисленные выше символы (кроме слеша) использовать можно, но из соображений совместимости их лучше избегать. | |
</pre> |
Если вам кажется, что нет ничего проще, чем придумать имя для файла или папки, то скорее всего вы ошибаетесь. Существуют правила из-за которых нельзя назвать файл любым именем как обычный физический предмет. Для начала проясним, что такое имя файла, и как оно используется.
Понятия «путь» и «имя файла»
Очень часто в компьютерной литературе используются термины «путь» и «имя файла» под разными значениями. Обычно под словом «путь» понимают адрес или расположение файла, т. е. диск, папка и подпапки в которых расположен файл. Однако Microsoft и другие считают, что в путь к файлу входит не только его расположение но и само имя файла. А некоторые подразумевают под словом «путь» только имена файла и папок, в которых он расположен, без указания диска. Некоторые пользователи полагают, что «имя файла» не включает расширение. В данной статье расширение всегда является частью имени файла. На примере ниже синим цветом выделен путь к файлу, а красным имя файла.
X:папкаподпапкафайл.расширение
Зарезервированные символы и имена
Большинство часто употребляемых символов разрешается использовать в имени файла. Имя файла не должно содержать „<” (знак меньше), „>” (знак больше), „:” (двоеточие), „«” (двойные кавычки), „/” (слеш), „” (обратный слеш), „|” (вертикальная черта), „?” (вопросительный знак), „*” (звездочка), а также не может заканчиваться точкой или пробелом. Файлы также нельзя называть зарезервированными именами устройств: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, и LPT9.
Ограничения на длины имен файлов и путей
Существуют ограничения на длину имени файла и на длину пути. Абсолютное ограничение длины имени файла вместе включая путь к нему равно 260 символам. Этот предел называют термином MAX_PATH. На самом же деле на практике пределы для имен еще меньше из-за ряда других ограничений. Например, каждая строка на конце должна содержать так называемый нулевой символ, который обозначает конец строки. Несмотря на то, что маркер конца строки не отображается, он учитывается как отдельный символ при подсчете длины, а значит остается 259 символов доступных для имени файла и пути к нему. Первые три символа в пути используются для обозначения диска (например, C:). Это уменьшает предел для имен папок, подпапок и файла до 256 символов.
На имя объекта (папки или файла) наложено ограничение длины 255 символов. Этот предел действителен только, если объект не расположен внутри папки. Так как при расположении объекта внутри папки, сумма длин всех папок в которых он расположен, разделителей и имени объекта ограничена 256 символами, то предел длины самого имени объекта меньше 255 символов.
Under Linux and other Unix-related systems, there were traditionally only two characters that could not appear in the name of a file or directory, and those are NUL ''
and slash '/'
. The slash, of course, can appear in a pathname, separating directory components.
Rumour1 has it that Steven Bourne (of ‘shell’ fame) had a directory containing 254 files, one for every single letter (character code) that can appear in a file name (excluding /
, ''
; the name .
was the current directory, of course). It was used to test the Bourne shell and routinely wrought havoc on unwary programs such as backup programs.
Other people have covered the rules for Windows filenames, with links to Microsoft and Wikipedia on the topic.
Note that MacOS X has a case-insensitive file system. Current versions of it appear to allow colon :
in file names, though historically that was not necessarily always the case:
$ echo a:b > a:b
$ ls -l a:b
-rw-r--r-- 1 jonathanleffler staff 4 Nov 12 07:38 a:b
$
However, at least with macOS Big Sur 11.7, the file system does not allow file names that are not valid UTF-8 strings. That means the file name cannot consist of the bytes that are always invalid in UTF-8 (0xC0, 0xC1, 0xF5-0xFF), and you can’t use the continuation bytes 0x80..0xBF as the only byte in a file name. The error given is 92 Illegal byte sequence.
POSIX defines a Portable Filename Character Set consisting of:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -
Sticking with names formed solely from those characters avoids most of the problems, though Windows still adds some complications.
1 It was Kernighan & Pike in [‘The Practice of Programming’](http://www.cs.princeton.edu/~bwk/tpop.webpage/) who said as much in Chapter 6, Testing, §6.5 Stress Tests:
When Steve Bourne was writing his Unix shell (which came to be known as the Bourne shell), he made a directory of 254 files with one-character names, one for each byte value except
''
and slash, the two characters that cannot appear in Unix file names. He used that directory for all manner of tests of pattern-matching and tokenization. (The test directory was of course created by a program.) For years afterwards, that directory was the bane of file-tree-walking programs; it tested them to destruction.
Note that the directory must have contained entries .
and ..
, so it was arguably 253 files (and 2 directories), or 255 name entries, rather than 254 files. This doesn’t affect the effectiveness of the anecdote, or the careful testing it describes.
TPOP was previously at
http://plan9.bell-labs.com/cm/cs/tpop and
http://cm.bell-labs.com/cm/cs/tpop but both are now (2021-11-12) broken.
See also Wikipedia on TPOP.
Under Linux and other Unix-related systems, there were traditionally only two characters that could not appear in the name of a file or directory, and those are NUL ''
and slash '/'
. The slash, of course, can appear in a pathname, separating directory components.
Rumour1 has it that Steven Bourne (of ‘shell’ fame) had a directory containing 254 files, one for every single letter (character code) that can appear in a file name (excluding /
, ''
; the name .
was the current directory, of course). It was used to test the Bourne shell and routinely wrought havoc on unwary programs such as backup programs.
Other people have covered the rules for Windows filenames, with links to Microsoft and Wikipedia on the topic.
Note that MacOS X has a case-insensitive file system. Current versions of it appear to allow colon :
in file names, though historically that was not necessarily always the case:
$ echo a:b > a:b
$ ls -l a:b
-rw-r--r-- 1 jonathanleffler staff 4 Nov 12 07:38 a:b
$
However, at least with macOS Big Sur 11.7, the file system does not allow file names that are not valid UTF-8 strings. That means the file name cannot consist of the bytes that are always invalid in UTF-8 (0xC0, 0xC1, 0xF5-0xFF), and you can’t use the continuation bytes 0x80..0xBF as the only byte in a file name. The error given is 92 Illegal byte sequence.
POSIX defines a Portable Filename Character Set consisting of:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -
Sticking with names formed solely from those characters avoids most of the problems, though Windows still adds some complications.
1 It was Kernighan & Pike in [‘The Practice of Programming’](http://www.cs.princeton.edu/~bwk/tpop.webpage/) who said as much in Chapter 6, Testing, §6.5 Stress Tests:
When Steve Bourne was writing his Unix shell (which came to be known as the Bourne shell), he made a directory of 254 files with one-character names, one for each byte value except
''
and slash, the two characters that cannot appear in Unix file names. He used that directory for all manner of tests of pattern-matching and tokenization. (The test directory was of course created by a program.) For years afterwards, that directory was the bane of file-tree-walking programs; it tested them to destruction.
Note that the directory must have contained entries .
and ..
, so it was arguably 253 files (and 2 directories), or 255 name entries, rather than 254 files. This doesn’t affect the effectiveness of the anecdote, or the careful testing it describes.
TPOP was previously at
http://plan9.bell-labs.com/cm/cs/tpop and
http://cm.bell-labs.com/cm/cs/tpop but both are now (2021-11-12) broken.
See also Wikipedia on TPOP.
Вообще командная строка винды достаточно капризна к не буквенно-цифровым символам. И не только в начале файла, но и в любом месте имени файла или каталога.
Выше перечисленные Сергей В символы нельзя использовать, потому что это спец.символы cmd.exe (используются ею для собственных нужд), но есть еще куча других символов, которые не являются спец.символами, но от которых cmd.exe так же корежит. Поэтому лучшая рекомендация тут — вообще не использовать не буквенно-цифровые символы в названиях файлов.
Так же сходу могу добавить к списку:
! — при использовании в батнике команды setlocal enabledelayedexpansion восклицательный знак становиться спец.символом
% — внутри батника является спец.символом.
^ — является спец.символом
Символы, которые cmd.exe нормально переносит: _.,~@#-+=/{}[]’` и пробел
Кстати двоеточие, похоже, актуально только для начала файла, в любом другом месте — его использовать можно.
В свое время мне пришлось обходить проблему не стандартных символов в cmd.exe, поэтому знаком с ней не понаслышке.
И еще, проблемы с символами появляются именно в применении к командным файлам cmd.exe, если у вас другая задача, то возможно, эта проблема не будет для вас стоять так остро.
Системы Windows и Linux позволяют создавать и называть файлы и каталоги в соответствии с вашими требованиями, но некоторые символы нельзя использовать для названия каталогов и файлов. В этой статье мы узнаем о запрещенных символах в именах каталогов Windows и Linux.
Содержание
- Запрещенные символы в именах каталогов Windows и Linux
- Linux/Unix
- Windows
- Запрещенные непечатаемые символы
- Linux/Unix
- Windows
- Запрещенные (зарезервированные) имена
- Заключение
Запрещенные символы в именах каталогов Windows и Linux
Некоторые символы являются печатными символами ASCII, а некоторые — непечатными. Вот символы, которые не поддерживаются для имен файлов и каталогов.
Linux/Unix
Windows
< (меньше чем)
> (больше чем)
: (двоеточие - иногда работает, но на самом деле это NTFS Alternate Data Streams)
" (двойная кавычка)
/ (прямая косая черта)
(обратная косая черта)
| (вертикальная полоса или труба)
? (вопросительный знак)
* (звездочка)
Запрещенные непечатаемые символы
Здесь перечислены непечатаемые символы, которые нельзя использовать в качестве имен файлов или имен каталогов.
Здесь перечислены непечатаемые символы, которые нельзя использовать в качестве имен файлов или имен каталогов.
Linux/Unix
- 0 (байт NULL)
Windows
- 0-31 (управляющие символы ASCII)
Запрещенные (зарезервированные) имена
Помимо вышеперечисленных символов, существуют также определенные зарезервированные имена файлов, которые нельзя использовать в Windows, как с расширением, так и без него.
- CON, PRN, AUX, NUL
- COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
- LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
Заключение
Также помните, что Windows не различает символы верхнего и нижнего регистра в именах файлов и каталогов, поэтому если вы попытаетесь назвать один файл как a.txt, а другой файл в том же каталоге как A.txt, это не позволит вам этого сделать.
Наконец, следует отметить, что в Windows имена файлов и каталогов не могут заканчиваться пробельными символами.
В этой статье мы узнали о запрещенных символах для имен файлов и каталогов в Windows и Linux.
Если вы загружаете на сайт файлы (документы, изображения, архивы и пр.), и подразумевается, что доступ к этим файлам будет публичный, а не ограниченный списком избранных товарищей, нужно иметь в виду, что различные многочисленные пользователи сети интернет используют разные устройства ( настольные компьютеры, ноутбуки, планшеты, смартфоны, …) и разные операционные системы (Mac, PC, Linux, …).
И чтобы у всех ваши файлы адекватно открывались, отображались и скачивались, нужно перестраховаться и избегать использования в названиях файлов и каталогах сайта запрещенных символов.
Использование правильных названий для папок и файлов очень важно для web, особенно — для загружаемых файлов, таких как PDF-файлы, документы MS Word, электронные таблицы MS Excel и др.
Создавая и формируя любой документ, мы не имеем ограничений по используемым символам внутри него и можем писать в нем любые, даже запрещенные символы. Но для сохранения файла нужно присваивать ему имя с учетом некоторых правил и ограничений интернета.
Не используйте следующие запрещенные символы в названиях директорий и файлов:
# — pound (решетка) | < — left angle bracket (знак «меньше») | $ — dollar sign (доллар) | + — plus sign (плюс) |
% — percent (процент) | > — right angle bracket (знак «больше») | ! — exclamation point (восклицательный знак) | ` — backtick (обратная кавычка) |
& — ampersand (амперсенд) | * — asterisk (звездочка) | ‘ — single quotes (одинарные кавычки) | | — pipe (вертикальная черта) |
{ — left bracket (левая фигурная скобка) | ? — question mark (вопросительный знак) | “ — double quotes (двойные кавычки) | = — equal sign (равно) |
} — right bracket (правая фигурная скобка) | / — forward slash (прямой слеш) | : — colon (двоеточие) | |
— back slash (обратный слеш) | — blank spaces (пробел) | @ — at sign (собачка) |
Не каждый сайт или сервер имеет механизм проверки файлов и, зачастую, даже если имя файла содержит запрещенные символы, вы все равно сможете загрузить его на сервер. Но вот скачать его, скорее всего, никто не сможет, особенно, через web-интерфейс.
Рассмотрим ситуацию, в которой пользователь загрузил на сайт PDF-файл, содержащий в названии символ «Решетка» (pound) — #. Сервер имеет операционную систему Linux. Поведение сервера при наличии таких символов в именах файлов будет неадекватным.
В этом случае апач считает что URL — это все, что находится перед знаком «Решетка», а все что после него — это якорь на HTML-странице, т.е. ссылка на конкретное место в HTML-документе. Соответственно, он не распознает его, как файл и не отдает пользователю.
Так как на большинстве сайтов используется автоматический Загрузчик файлов, который без лишних вопросов загружает то, что пользователь выбирает на своем компьютере. Поведение апача верное, но он не может отличить файл от html, для него всё является ссылкой, поэтому он так и будет обрабатывать.
Таким образом, нужно всего лишь не использовать символы запрещенные для имен и папок на сайте. Это самое простое в реализации.
Дополнительно, запомните следующие правила и постарайтесь им следовать:
- Название файлов не должно начинаться и заканчиваться знаком «Пробел» (space), «Точка» (period), «Дефис» (hyphen) или «Подчеркивание» (underline);
- Не присваивать файлам слишком длинные названия, постараться не превышать 31 символ;
- По возможности всегда использовать только маленькие буквы, некоторые операционные системы чувствительны к регистру;
- Избегайте использование знака «Пробел» и «Подчеркивание», если название файла состоит из нескольких слов. В этом случае лучше используйте знак «Дефис».
- Не используйте отличные от латиницы буквы для названий файлов и папок (русские, китайские, немецкие с умляут и др.). Не смотря на широкие возможности современных кодировок типа UTF-8, у некоторых пользователей могут возникнуть трудности с файлами, имеющими такие экзотические символы в названии.