Запрещенные символы для linux

Имена файлов Linux /Windows /Unix /â | |: Какие символы разрешены? Что не скрыто?

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

4 ответа

В статье Wikipedia обсуждается имя файла с именем Имена файлов .

Вы можете найти это эссе информативным: Фиксация имен файлов Unix /Linux /POSIX .

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

Я не знаю, какие символы должны быть un -escaped, но в Linux, вероятно, небезопасно избегать символов, которые могут иметь особое значение, таких как «n» (новая строка) , «t» (вкладка) и другие, но это обычно не проблема в файловых операциях. Возможно, вы имеете в виду «бегство», а не «невыполнение». Наиболее распространенными являются те, которые интерпретируют оболочка, такие как пространство, «>», « 13 июня 2010, 02:29:49

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

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

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

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

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

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

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

Источник

Samba и запрещенные символы

Samba (самба) под Linux. Этот удивительный софт подарил линуксоидам возможность связи с миром Windows.
Помню то дивное чувство, когда в локальной сети появился мой первый самба-сервер. Эх, было время!

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

Подробности моих злоключений и (почти) счастливый финал под катом. Приступим!

Я увлекаюсь коллекционированием фильмов. Вначале они помещались на один диск и это было просто. Потом дисков стало больше, помогали бумажки и Excel. Но всему хорошему приходит конец и пришлось задуматься о создании полноценной базы данных. Одним из следствий такой разработки появились виртуальные папки/списки фильмов.

Позволю себе лирическое отступление. У самбы есть одна прекрасная фишка — работа с симлинками. И если эти симлинки не ведут на доступный ресурс, то они не видны. Это позволяет иметь директорию (и не одну), в которой каждая позиция, это симлинк на конкретное хранилище. Если диск подключен, то симлинк отображается как доступная директория. Если нет — то директория не отображается вовсе. По этой причине (а также по иным, не имеющим отношения к теме) уже много лет используется самба и подобные папки (видны как в плеерах, Windows, так и на линукс клиентах).

Однако эту идиллию разрушает то, что наличие, например, двоеточия, превращает прекрасную папку вида (здесь я намеренно вставил двоеточие, позже объясню почему выбран именно этот фильм): 2008 — Вавилон Н.Э. — Babylon: A.D. в такую: 2NIQRO

Что же делать?

Вначале я ошибочно смотрел в сторону опции монтирования mapchars. Но она на самом деле ничего не решала, причем она дополнительно могла приводить к странным именам файлов.

Я понимал что нужно искать что-то, что сможет заменять названия файлов на лету. Значит нужна автоподстановка. Но таких модулей все никак не находилось, либо они работали не так, как хотелось бы. За время поисков третья версия самбы стала стабильной. А в ней появились т.н. Stackable VFS modules, т.е. модули виртуальной файловой системы. Это было то, что я искал!

Читайте также:  Работа windows с usb флешки

Однако нужного мне модуля все не находилось. Версия самбы из третьей превратилась в четвертую и я был близок к тому чтобы попытаться написать модуль самому (хотя знаком с системным программированием только отдаленно). Но непрекращающиеся поиски привели меня к модулю vfs_catia, который был создан для решения проблем с Catia CAD, также создающей названия с запрещенными символами, но делал именно то, что и требовалось. Полная его функциональность раскрывается с версии самбы 3.5.0 и далее. Я тестировал на версиях 4.1.x довольно продолжительное время.

Дальнейшее было делом техники. Используемая мной система — Debian — уже имеет пакет samba-vfs-modules, содержащий данный плагин. Он был установлен и настроена замена нелегальных символов их аналогами (конфиг файл: /etc/samba/smb.conf, секция [global]):

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

Счастливый финал

После добавления кода перегружаем демона самбы и магия в действии:
2015 — Терминатор÷ Генезис — Terminator Genisys

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

Теперь напомню почему в качестве первого примера я выбрал фильм Вавилон Н.Э… Дело в том, что точка в конце названия файла или директории в файловой системе Windows недопустима. Поэтому-то 2008 — Вавилон Н.Э. — Babylon A.D. все равно показывается как 2XJW59

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

Спасибо за внимание и да пребудет с вами Сила!

Источник

Какие символы запрещены в именах каталогов Windows и Linux?

Я знаю, что / является незаконным в Linux, а следующее — в Windows. (Я думаю) * . » / \ [ ] : ; | ,

Что еще мне не хватает?

Однако мне нужно подробное руководство, учитывающее двухбайтовые символы. Ссылки на внешние ресурсы меня устраивают.

Мне нужно сначала создать каталог в файловой системе, используя имя, которое может содержать запрещенные символы, поэтому я планирую заменить эти символы символами подчеркивания. Затем мне нужно записать этот каталог и его содержимое в zip-файл (используя Java), поэтому любые дополнительные советы относительно имен zip-каталогов будут оценены.

15 ответов

«Исчерпывающий справочник» запрещенных символов имени файла не будет работать в Windows, потому что он резервирует имена файлов, а также символы. Да, такие персонажи, как * » ? и другие запрещены, но есть бесконечное количество запрещенных имен, состоящих только из допустимых символов. Например, пробелы и точки являются допустимыми символами имени файла, но имена, состоящие только из этих символов, запрещены.

Windows не различает символы верхнего и нижнего регистра, поэтому вы не можете создать папку с именем A , если папка с именем a уже существует. Хуже того, кажущиеся разрешенными имена, такие как PRN и CON , и многие другие зарезервированы и не разрешены. Windows также имеет несколько ограничений по длине; имя файла, допустимое в одной папке, может стать недействительным при перемещении в другую папку. Правила для присвоение имен файлам и папкам находятся в документации Microsoft.

Как правило, вы не можете использовать созданный пользователем текст для создания имен каталогов Windows. Если вы хотите разрешить пользователям называть все, что они хотят, вы должны создать безопасные имена, такие как A , AB , A2 и др., Хранить созданные пользователем имена и их эквиваленты пути в файл данных приложения и выполнить сопоставление путей в вашем приложении.

Читайте также:  Set exe as windows service

Если вам абсолютно необходимо разрешить имена папок, созданные пользователем, единственный способ определить, являются ли они недопустимыми, — это перехватить исключения и предположить, что имя недопустимо. Даже это чревато опасностями, поскольку исключения, создаваемые для запрещенного доступа, автономных дисков и отсутствия дискового пространства, перекрываются с теми, которые могут быть созданы для недопустимых имен. Вы открываете одну огромную банку боли.

Давайте будем простыми и сначала ответим на вопрос.

Запрещенные печатаемые символы ASCII :

Непечатаемые символы

Если ваши данные поступают из источника, допускающего использование непечатаемых символов, то есть еще кое-что, что нужно проверить.

Примечание. Хотя в файловых системах Linux / Unix создание файлов с управляющими символами в имени файла является законным, пользователям может показаться кошмаром иметь дело с такими файлами.

Зарезервированные имена файлов

Следующие имена файлов зарезервированы:

(как сами по себе, так и с произвольными расширениями файлов, например LPT1.txt ).

Другие правила

Имена файлов не могут заканчиваться пробелом или точкой.

Вы не просили об этом, но на всякий случай: двоеточие : и косая черта / в зависимости от контекста не разрешены (например, Finder поддерживает косые черты, терминал поддерживает двоеточия). Подробнее см. https://superuser.com. / questions / 326103 / what-are-invalid-characters-for-a-file-name-under-os-x

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

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

В этом духе можно считать безопасными следующие символы:

  • Буквы (a-z A-Z) — при необходимости также символы Юникода
  • Цифры (0-9)
  • Нижнее подчеркивание (_)
  • Дефис (-)
  • Космос
  • Точка (.)

И любые дополнительные безопасные символы, которые вы хотите разрешить. Помимо этого, вам просто нужно ввести некоторые дополнительные правила относительно пробелов и точек . Обычно этого достаточно:

  • Имя должно содержать хотя бы одну букву или цифру (чтобы не было только точек / пробелов).
  • Имя должно начинаться с буквы или цифры (чтобы избежать точек / пробелов в начале).
  • Имя не может заканчиваться точкой или пробелом (просто обрежьте их, если они есть, как это делает Explorer).

Это уже допускает довольно сложные и бессмысленные имена. Например, эти имена будут возможны с этими правилами и будут допустимыми именами файлов в Windows / Linux:

По сути, даже с таким небольшим количеством символов в белом списке вы все равно должны решить, что на самом деле имеет смысл, и соответствующим образом проверить / скорректировать имя. В одном из своих приложений я использовал те же правила, что и выше, но удалил все повторяющиеся точки и пробелы.

Самый простой способ заставить Windows сказать вам ответ — это попытаться переименовать файл через проводник и ввести / вместо нового имени. Windows отобразит окно сообщения со списком недопустимых символов.

Что ж, если только для исследовательских целей, то лучше всего взглянуть на эту запись в Википедии о именах файлов .

Если вы хотите написать переносимую функцию для проверки введенных пользователем данных и создания имен файлов на их основе, краткий ответ — не нужно . Взгляните на портативный модуль, такой как File :: Spec Perl, чтобы получить представление обо всех хмель, необходимый для выполнения такой «простой» задачи.

Для тех, кто ищет регулярное выражение:

В Windows 10 (2019) следующие символы запрещены ошибкой при попытке их ввода:

Имя файла не может содержать следующие символы:

Хотя единственными недопустимыми символами Unix могут быть / и NULL , хотя следует учитывать некоторую интерпретацию командной строки.

Например, хотя в Unix может быть законным называть файл 1>&2 или 2>&1 , такие имена файлов могут быть неверно интерпретированы при использовании в командной строке.

Читайте также:  Прошить биос видеокарты nvidia windows

Точно так же можно было бы назвать файл $PATH , но при попытке доступа к нему из командной строки оболочка преобразует $PATH в его значение переменной.

Вот реализация C # для Windows на основе ответа Кристофера Озбека

Он был усложнен логическим значением containsFolder, но, надеюсь, охватывает все

По состоянию на 18.04.2017 среди ответов на эту тему нет простого черного или белого списка символов и имен файлов — и есть много ответов.

Лучшее предложение, которое я мог придумать, — позволить пользователю называть файл так, как ему нравится. Используя обработчик ошибок, когда приложение пытается сохранить файл, перехватите любые исключения, предположите, что виновато имя файла (очевидно, после того, как убедитесь, что путь сохранения был в порядке), и запросите у пользователя новое имя файла. Для достижения наилучших результатов поместите эту процедуру проверки в цикл, который продолжается до тех пор, пока пользователь не поймет правильно или не сдастся. Лучше всего сработал для меня (по крайней мере, в VBA).

Я всегда предполагал, что запрещенные символы в именах файлов Windows означают, что все экзотические символы также будут запрещены. В особенности меня раздражала невозможность использовать ? , / и : . Однажды я обнаружил, что фактически запрещены только те символы. Могут использоваться другие символы Юникода. Таким образом, были идентифицированы ближайшие символы Unicode к запрещенным, которые я смог найти, и для них были созданы макросы MS Word как Alt + ? , Alt + : и т. д. Теперь я формирую имя файла в Word, используя заменяющие символы, и копирую его в имя файла Windows. Пока проблем не было.

Вот заменяющие символы ( Alt + десятичный Unicode):

  • ⃰ ⇔ Alt 8432
  • ⁄ ⇔ Alt 8260
  • ⃥ ⇔ Alt 8421
  • ∣ ⇔ Alt 8739
  • ⵦ ⇔ Alt 11622
  • ⮚ ⇔ Alt 11162
  • ‽ ⇔ Alt 8253
  • ፡ ⇔ Alt 4961
  • ‶ ⇔ Alt 8246
  • ″ ⇔ Alt 8243

В качестве теста я сформировал имя файла, используя все эти символы, и Windows приняла его.

При создании интернет-ярлыков в Windows, чтобы создать имя файла, он пропускает недопустимые символы, за исключением косой черты, которая преобразуется в минус.

.NET Framework System.IO предоставляет следующие функции для недопустимых символов файловой системы:

Эти функции должны возвращать соответствующие результаты в зависимости от платформы, на которой работает среда выполнения .NET.

В оболочках Unix вы можете заключить почти каждый символ в одинарные кавычки ‘ . За исключением самой одинарной кавычки, и вы не можете выражать управляющие символы, потому что \ не раскрывается. Доступ к самой одинарной кавычке из строки в кавычках возможен, потому что вы можете объединять строки в одинарные и двойные кавычки, например ‘I'»‘»‘m’ , который можно использовать для доступа к файлу с именем «I’m» (здесь также возможны двойные кавычки ).

Поэтому вам следует избегать всех управляющих символов, потому что их слишком сложно ввести в оболочку. Остальное по-прежнему забавно, особенно файлы, начинающиеся с тире, потому что большинство команд читают их как параметры, если у вас нет двух тире — перед этим или вы не укажете их с помощью ./ , что также скрывает начало — .

Если вы хотите быть вежливым, не используйте какие-либо символы, используемые оболочкой и типичными командами в качестве синтаксических элементов, иногда зависимых от позиции, например, вы все равно можете использовать — , но не в качестве первого символа; то же самое с . , вы можете использовать его в качестве первого символа только тогда, когда вы его имеете в виду («скрытый файл»). Когда вы имеете в виду, ваши имена файлов — это escape-последовательности VT100 ;-), так что ls искажает вывод.

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

Источник

Оцените статью