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

43

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

java.is.for.desktop
источник
Ниже приведены некоторые полезные ответы, но чего вы пытаетесь достичь? Кодирование подпрограмм белого списка вашего персонажа, вероятно, не лучший путь.
Медина
Спасибо всем! Все ответы полезны. Для чего мне нужна информация: я пишу инструмент, который будет помечать файлы в файловой системе, изменяя их имена (без метаданных).
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) обозначает конец строки. Все остальное разрешено.

janneb
источник
1
Хотя настоятельно рекомендуется избегать перевода строки, табуляции, управляющих символов и т. П., А также чтобы убедиться, что имя файла является допустимым UTF-8.
Флим