Какие символы безопасны в кросс-платформенных именах файлов для Linux, Windows и OS-X

60

В настоящее время я использую YYMMDD-NAME+PAGEимя для большинства моих файлов. NAMEимеет пробелы, преобразованные в подчеркивания.

Я хотел бы использовать YYYY-MM-DDформат даты, но я не уверен, как отделить его от имени. А -выглядело бы странно, если бы имя начиналось с цифры. Если я использую _, то это конфликтует с подчеркиванием, представляющим пробел.

Какие символы достаточно безопасны в именах файлов, которые будут работать здесь? Я использую Linux, но я могу делиться файлами с другими людьми (Windows 7, Mac OS X).

Мартин Уединг
источник
... на Unix, Windows, Amiga 1000?
Slhck
В основном современный Linux.
Мартин Уединг
- Символ безопасен для использования в Windows 7 .. может быть, другие современные операционные системы делают то же самое .. Вы можете использовать символ минус для разделения ..
Ниранджан Сингх
возможный межсайтовый дубликат: stackoverflow.com/questions/4814040/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Ответы:

48

Резюме:

  • Windows: все, кроме управляющих символов ASCII и \/:*?"<>|
  • Linux, OS-X: все, кроме нуля или /

На всех платформах лучше избегать непечатных символов, таких как управляющие символы ASCII.

Windows

В Windows проводник Windows не допускает управляющие символы или \/:*?"<>|вы можете использовать пробелы. Если вы используете пробелы, вам часто придется заключать в кавычки имя файла при использовании из командной строки (но насколько я знаю, приложения с графическим интерфейсом не затрагиваются). Файловая система Windows, такая как NTFS, очевидно, хранит кодировку с именем файла, но UTF-16 является стандартным.

Некоторые части Windows чувствительны к регистру, другие части не чувствительны к регистру. В файловой системе Windows NTFS легко создавать отдельные имена файлов, такие как «Ab» и «ab». Эти имена относятся к отдельным файлам, которые содержат отдельный отдельный контент. Тем не менее, хотя в командной строке Windows будут успешно перечислены оба файла с помощью dir, вы не можете легко получить доступ или манипулировать одним из них с помощью таких команд, как type. Смотри ниже.

Linux, OS-X

В Linux и OS-X /запрещено только печатный набор ASCII. Некоторые символы (например, метасимволы оболочки *?!) вызовут проблемы в командной строке и потребуют, чтобы имя файла было соответствующим образом заключено в кавычки или экранировано.

Файловые системы Linux, такие как ext2, ext3, не зависят от набора символов (я думаю, они просто более или менее воспринимают его как поток байтов - только нули и /запрещены). Это означает, что вы можете хранить имена файлов в кодировке UTF-8. Я полагаю, что это зависит от оболочки или другого приложения, чтобы знать, какую кодировку использовать для правильного преобразования имени файла для отображения или обработки.

Заключение

Таким образом, вы могли бы безопасно использовать что-то вроде (если бы не было так сложно печатать)


Чувствительность к регистру (в) в Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Обратите внимание, что мы не можем набрать содержимое второго файла, команда Windows typeпросто возвращает содержимое Ab. Третий файл также будет отличаться от aB в Linux.

(Windows 10 NTFS).

RedGrittyBrick
источник
1
В целом хороший ответ, но я бы воздерживался от использования имен файлов в пробелах. Избежать их правильно во всех контекстах - больше проблем, чем стоит. Обратите внимание, что Microsoft перестала использовать пространство в именах системных каталогов. Если вам нужно указать границы слов в именах, CamelCase работает нормально.
Исаак Рабинович
4
«C: \ Program Files (x86)» все еще существует в Win8 - это не системный каталог? Я согласен, что пробелы могут вызвать проблемы.
RedGrittyBrick
Это так, но его можно переименовать во что угодно. Конечно, многие программы будут выходить из себя, если вы переименуете его в «]: \ foobar», но Windows все равно будет называть его «% programfiles (x86)%».
отмечает Томас
2
Здесь нужно иметь в виду, что система Linux может рассматривать верхний и нижний регистры как разные, тогда как Windows считает их одинаковыми.
Thecoshman
1
Вы будете удивлены, сколько программ сосут при разборе. Вот почему не было Windows 9.
Исаак Рабинович
46

Хотя ответ RedGrittyBrick технически верен, безопасность - не единственная проблема: удобство использования также важно. Я думаю, что лучший вопрос - «какие символы хорошо использовать в имени файла».

Некоторые потенциальные рекомендации:

  • [0-9a-zA-Z_] - Буквенно-цифровые символы и подчеркивание всегда подойдут .
  • \/:*?"<>|и нулевой байт проблематичен как минимум в одной системе, и его всегда следует избегать.
  • Пробелы используются в качестве разделителей аргументов во многих системах, поэтому по возможности следует избегать имен файлов с пробелами. Другие пробелы (например, вкладки) тем более.
  • Точки с запятой (;) используются для разделения команд во многих системах. Точки с запятой и запятые (,) используются для разделения аргументов командной строки (в некоторых версиях?) Командной строки Windows.
  • []()^ #%&!@:+={}'~и [`] у всех есть особые значения во многих оболочках, и они раздражают, чтобы обходить их, и поэтому их следует избегать. Они также имеют тенденцию выглядеть ужасно в URL .
  • Ведущие персонажи, которых следует избегать:
    • Многие программы командной строки используют дефис [-] для указания специальных аргументов.
    • * Системы на базе nix используют точку [.] в качестве ведущего символа для скрытых файлов и каталогов.
  • Все, что не входит в набор ASCII, может вызвать проблемы в старых или более базовых системах (например, в некоторых встроенных системах), и его следует использовать с осторожностью.

Это в основном оставляет вас с:

[0-9a-Za-Z -._]

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

naught101
источник
1
Фигурные скобки ( []) являются частью регулярных выражений и также имеют особое значение в оболочке. Но с ними не так уж плохо работать, за исключением некоторых злых угловых дел.
Мартин Уединг
1
Хм ... Полагаю, то же самое можно сказать и о ()самом деле.
naught101
4
В zsh символы, которые могут интерпретироваться по-разному, включают в себя []()^;, так что я думаю, что правильным ответом на самом деле может быть [0-9a-zA-Z.,_-]запятая, которая также может быть исключена только потому, что это странно видеть в имени файла, хотя я не могу вспомнить фактический случай, когда это вызвало бы проблемы.
Кейси Родармор
да, я удалил их из окончательного списка
naught101
1
Запятая может раздражать, попробуйте echo whereami > a,b,cв окне командной строки Win10.
RedGrittyBrick
4

Вы могли бы:

  1. заменить текущее подчеркивание на #(символ корректора для пробела)
  2. подчеркивание даты «раздела» из имени файла (или второй дефис - легче набрать)

Alt-1. начальные заглавные буквы могут заменить пробелы: YYMMDD-HHMM-FileName.extилиYYMMDD-HHMM_FileName.ext

Минимальные символы для четкого отображения, которые автоматически сортируются с добавленными нулями за январь-сентябрь (& 1-й-9-й месяц).

TB01
источник