Перейти к содержимому

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

44

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

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

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

31 321 просмотр
Martin Ueding спросил 14 лет назад
M 820

3 ответа

39
Принятый ответ

Резюме:

  • 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).

В целом хороший ответ, но я бы воздерживался от использования имен файлов в пробелах. Избежать их должным образом во всех контекстах - больше проблем, чем оно того стоит. Обратите внимание, что Microsoft перестала использовать пробел в именах системных каталогов. Если вам нужно указать границы слов в именах, CamelCase работает нормально.

Isaac Rabinovitch · 13 лет назад · 1

«C: \ Program Files (x86)» все еще существует в Win8 - это не системный каталог? Я согласен, что пробелы могут вызвать проблемы.

RedGrittyBrick · 13 лет назад · 3

Это так, но его можно переименовать во что угодно. Конечно, многие программы будут выходить из себя, если вы переименуете его в «]: \ foobar», но Windows все равно будет называть его «% programfiles (x86)%».

Marcks Thomas · 13 лет назад · 0

@RedGrittyBrick Упс. Хорошая точка зрения. Я должен был сказать, что MS перестала использовать имена с пробелами для недавно изобретенных системных каталогов.

Isaac Rabinovitch · 13 лет назад · 0

Здесь нужно иметь в виду, что система Linux может рассматривать прописные и строчные буквы как разные, в то время как Windows считает их одинаковыми.

thecoshman · 10 лет назад · 2

@thecoshman +1, это очень важно и должно быть прочитано любым, кто задает этот вопрос.

Seph Reed · 9 лет назад · 0

@IsaacRabinovitch есть также «Информация о томе системы», «Документы и настройки», «Все пользователи», «Корзина» ... И «Мои документы», «Мои видео» ... хотя они только системные созданные каталоги. На самом деле, если приложение не поддерживает пробелы в именах файлов в эту эпоху, я бы сразу выбросил его

phuclv · 9 лет назад · 0

Вы будете удивлены, сколько программ сосут при разборе. Вот почему не было Windows 9.

Isaac Rabinovitch · 9 лет назад · 1
RedGrittyBrick ответил 14 лет назад
R 66 369
37

While RedGrittyBrick's answer is technically correct, safety isn't the only issue: usability is also important. I think a better question is "what characters are good to use in a filename".

Some potential guidelines:

  • [0-9a-zA-Z_] - Alphanumeric characters and the underscore are always fine to use.
  • \/:*?"<>| and the null byte are problematic on at least one system, and should always be avoided.
  • Spaces are used as argument separators on many systems, so filenames with spaces should be avoided when possible.
  • Semicolons (;) are used to separate commands on many systems.
  • []()^ #%&!@:+={}'~ and [`] all have special meanings in many shells, and are annoying to work around, and so should be avoided. They also tend to look horrible in URLs.
  • Leading characters to avoid:
    • Many command line programs use the hyphen [-] to indicate special arguments.
    • *nix based systems use a full-stop [.] as a leading character for hidden files and directories.
  • Anything not in the ASCII set can cause problems on older or more basic systems (e.g. some embedded systems), and should be used with care.

That basically leaves you with:

[0-9a-zA-Z-.,_]

that are always safe and not annoying to use (as long as you start the filename with an alpha-numeric) :)

Скобки ([]) являются частью регулярных выражений и также имеют особое значение в оболочке. Но с ними не так уж плохо работать, за исключением некоторых злых угловых дел.

Martin Ueding · 12 лет назад · 1

Хм ... Полагаю, то же самое можно сказать о (), на самом деле.

naught101 · 12 лет назад · 1

В zsh символы, которые могут интерпретироваться по-разному, включают []() ^;, поэтому я думаю, что правильным ответом может быть [0-9a-zA-Z., _-]. Запятая также может быть исключена просто потому что это странно видеть в имени файла, хотя я не могу вспомнить фактический случай, когда это вызовет проблемы.

Casey Rodarmor · 11 лет назад · 4

да, я удалил их из окончательного списка

naught101 · 11 лет назад · 0

@ Phil_1984_: У меня тоже было несколько фигурных скобок: http://superuser.com/revisions/748264/1 :)

naught101 · 11 лет назад · 0

Именно то, что я искал - намного лучше, чем принятый ответ ИМО.

Franz D. · 11 лет назад · 0

Можно добавить, что следует избегать любых непечатаемых символов ASCII (т. Е. 0-31 и 127), хотя это подразумевается в окончательном наборе символов.

Franz D. · 11 лет назад · 0

А как насчет $?

Franz D. · 11 лет назад · 0

Я не думаю, что я бы включил . в список символов, которые" не раздражают в использовании ". Очевидно, что существует вероятность неправильной интерпретации как расширения и т. Д.

Steve Bennett · 10 лет назад · 0

Если вы собираетесь запретить пробелы, потому что они могут интерпретироваться оболочкой, то вам нужно запретить точку с запятой ';' также.

bronson · 10 лет назад · 0
бронсон: удалено. @SteveBennet: расширение - это просто соглашение. ",«это всего лишь одна строка - остановка не имеет никакого особого значения, кроме того, что дает ей определенное программное обеспечение (например, оно в основном просто используется как сокращение для« открыть с помощью «).
naught101 · 10 лет назад · 0

Я знаю, но это не меняет моего взгляда.

Steve Bennett · 10 лет назад · 0

@SteveBennett: ОК. Помимо скрытого поведения, уже отмеченного в ответе, что на самом деле делает использование периода в имени раздражающим? Я имею в виду, вы можете привести пример?

naught101 · 10 лет назад · 0

Ну, имя вроде foo.tar будет раздражать, потому что если оно будет разархивировано, оно станет foo.tar.gz, что будет неверно истолковано.

Steve Bennett · 10 лет назад · 0

@SteveBennet: То есть вы говорите, что вам следует избегать использования неподходящих расширений файлов (при условии, что foo.tar не является архивом tar)? Я полностью согласен.

naught101 · 10 лет назад · 0

запятая может раздражать, попробуйте echo whereami&gt; a, b, c в окне командной строки Win10.

RedGrittyBrick · 9 лет назад · 0
naught101 ответил 12 лет назад
N 576
4

Вы могли бы:

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

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

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

tb01 ответил 13 лет назад
T 41