Linux / Windows / Unix /… имена файлов: какие символы разрешены? Какие из них не спаслись?


43

Какие символы разрешены и какие из них должны быть экранированы в командной строке в разных операционных системах?


Ниже приведены некоторые полезные ответы, но чего вы пытаетесь достичь? Кодирование подпрограмм белого списка вашего персонажа, вероятно, не лучший путь.
— Медина

Спасибо всем! Все ответы полезны. Для чего мне нужна информация: я пишу инструмент, который будет помечать файлы в файловой системе, изменяя их имена (без метаданных).
— java.is.for.desktop

Смотрите также ответ на суперпользователя .
— pevik

Ответы:


27

В статье в Википедии об именах файлов есть обсуждение символов имени файла .

Вы можете найти это эссе информативным: Исправление имен файлов Unix / Linux / POSIX .

В этой статье сравниваются OS X и Windows XP: X и XP: запрещенные символы в именах файлов (PDF, см. Стр. 64-66).

Вещи, которые не должны быть в именах файлов за $ 1000 Алекс

Я не знаю, какие символы должны быть без экранирования, но в Linux, вероятно, не стоит избегать символов, которые могут иметь особое значение, таких как «n» (новая строка), «t» (табуляция) и другие, но это обычно не проблема в файловых операциях. Возможно, вы имеете в виду «сбежал», а не «бежал». Наиболее распространенными из них являются те, которые оболочка будет интерпретировать, такие как пробел, ">", "<" и т. Д. См. Некоторые статьи, на которые я ссылался, для обсуждения этих тем.


7
Это не совсем ответ - вся информация является внешней. И некоторые из этих ссылок сейчас не работают.
— Стив Беннетт

26

Единственными символами, которые не допускаются в имени файла в * nix, являются NULи /. В операционной системе Windows, только NUL, :и \действительно не допускается, но многие приложения ограничивают , что в дальнейшем, а также предотвращение ?, *, +, и %.

Ни в коем случае никакие символы в имени файла не должны быть экранированы, за исключением случаев, когда это не требуется для интерпретации оболочкой.


Второй момент заслуживает особого внимания. Обычно «экранирование» относится к механизму оболочки, который позволяет пользователю указывать строки (например, пути), которые содержат символы, которые в противном случае оболочка будет обрабатывать особым образом. Если OP означает использование чего-то вроде «процентного кодирования» для кодирования запрещенных символов, то это «протокол пути» чисто прикладного уровня, который должна принимать (или нет) каждая задействованная программа.
— Крис Джонсен

Я сканирую папку с помощью readdir, затем пытаюсь открыть файлы с именами, которые она возвращает. Некоторые из них не открываются с помощью ENOENT, что говорит о том, что даже для ОС иногда приходится бежать?
— мужчина

13

Если вы создадите файл в Windows с помощью Проводника, используя один из следующих символов, он будет жаловаться, что эти символы недопустимы:

\ / : * ? " < > |

Хорошая ссылка здесь:

Именование файлов, путей и пространств имен
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

Microsoft далее заявляет:

«... на настольных платформах под управлением Windows недопустимые символы пути могут включать символы ASCII / Unicode от 1 до 31, а также кавычки (»), меньше (<), больше (>), символ (|), обратный пробел (\ b), null (\ 0) и tab (\ t). "

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx


Я помню, как читал пару лет назад, что Windows в пользовательском режиме имеет эти ограничения, а также не учитывает регистр ("ABC.txt" === "abc.txt"). Однако Windows в режиме ядра имеет меньше ограничений и чувствительна к регистру ("ABC.txt"! == "abc.txt", как и * NIX). Тем не менее, для всех целей и задач вышеупомянутые символы будут применяться к большинству программ, потому что они работают в пользовательском режиме.
— CubicleSoft

Я могу избежать их \ / : * ? " < > |всех и создать их с помощью mkdir в моей системе GNU / Linux. Вы также можете использовать mkdir '?'для создания ?каталога. Я использовал ramdisk и файловую систему XFS, чтобы проверить это.
— Госвами

5

В Linux и других POSIX-совместимых системах, "/" зарезервирован как разделитель каталогов, а "\ 0" (символ NULL) обозначает конец строки. Все остальное разрешено.


1
Хотя настоятельно рекомендуется избегать перевода строки, табуляции, управляющих символов и т. П., А также чтобы убедиться, что имя файла является допустимым UTF-8.
— Флим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.