Какие символы нельзя использовать в имени файла linux

Обновлено: 02.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лучшее предложение, которое я мог придумать, - позволить пользователю называть файл так, как ему нравится. Используя обработчик ошибок, когда приложение пытается сохранить файл, перехватите любые исключения, предположите, что виновато имя файла (очевидно, после того, как убедитесь, что путь сохранения был в порядке), и запросите у пользователя новое имя файла. Для достижения наилучших результатов поместите эту процедуру проверки в цикл, который продолжается до тех пор, пока пользователь не поймет правильно или не сдастся. Лучше всего сработал для меня (по крайней мере, в 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, чтобы создать имя файла, он пропускает недопустимые символы, за исключением косой черты, которая преобразуется в минус.

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

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

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

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

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

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

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

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

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

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

давайте держать его простым и ответить на вопрос, в первую очередь.

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

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

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

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

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

следующие имена зарезервировано:

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

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

в Linux и других системах, связанных с Unix, есть только два символа, которые не могут отображаться в имени файла или каталога, и это NUL ' ' и Слэш '/' . Косая черта, конечно, может отображаться в имени пути, разделяя компоненты каталога.

слух 1 есть ли у Стивена Борна (из "shell" fame) каталог, содержащий 254 файла, по одному на каждую букву (код символа), которые могут отображаться в имени файла (исключая / , ' ' ; на имя . был текущий каталог, конечно). Он использовался для тестирования оболочки Борна и обычно наносил ущерб неосторожным программам, таким как программы резервного копирования.

другие люди покрыли правила Windows.

обратите внимание, что MacOS X имеет файловую систему без учета регистра.

1 это был Керниган и Пайк в практика программирования кто сказал это в главе 6, тестирование, §6.5 стресс Тесты:

когда Стив Борн писал свою оболочку Unix (которая стала известна как оболочка Борна), он сделал каталог из 254 файлов с односимвольными именами, по одному для каждого значения байта, кроме ' ' и Слэш, два символа, которые не могут отображаться в именах файлов Unix. Он использовал эту директорию для всевозможных тестов на соответствие шаблону и токенизацию. (Конечно, тестовый каталог был создан программой.) В течение многих лет после этого этот каталог был проклятием файл-дерево-Ходячие программы; он тестировал их до разрушения.

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

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

в этом духе, это набор символов, которые можно считать безопасным:

  • буквы (a-z A-Z) - символы Юникода, а также, если это необходимо
  • цифры (0-9)
  • подчеркивания (_)
  • дефис (-)
  • пробел
  • точка (.)

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

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

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

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

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

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

для Windows вы можете проверить его с помощью PowerShell

для отображения UTF-8 кодов вы можете конвертировать

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

пример кода VBA:(будут добавлены позже)

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

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

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

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

в оболочках Unix вы можете цитировать почти каждый символ в одинарных кавычках ' . Кроме самой одинарной кавычки, и вы не можете выражать управляющие символы, потому что \ не расширяется. Доступ к самой одинарной кавычке из строки с кавычками возможен, потому что вы можете объединить строки с одинарными и двойными кавычками, например 'I'"'"'m' который можно использовать для доступа к файлу с именем "I'm" (двойная цитата также возможна здесь).

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

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

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

Файловые системы ext2 и ext3 допускают наличие в именах файлов практически любых символов, кроме разделителя директорий ( / ). Однако я не советую использовать имена, содержащие русские буквы, знаки пунктуации (кроме точки), пробелы, псевдографику, экзотические знаки вроде символа перехода на новую строку. Не стоит также начинать имена файлов с дефиса ( - ). Тут дело в том, что многие программы, работающие с файлами, принимают в командной строке ключи (опции), начинающиеся с дефиса. Например, вы хотите пролистать каталог по имени -lR командой ls -lR . Но -lR будет воспринято программой ls не как имя каталога, а как ключи -l (выдать подробный листинг) и -R (рекурсивно), и в результате вы получите листинг текущего каталога (так как каталог не указан, программа ls по умолчанию работает с текущим). Во всех остальных случаях дефис в именах файлов вполне допустим и часто используется. Советуем ограничиться следующим набором символов — латинские буквы (большие и маленькие), цифры, знак подчёркивания, дефис (но не в начале), точка.

Заглавные и маленькие буквы

В файловых системах ext2 и ext3 (в отличие от файловых систем Microsoft Windows ) имена файлов являются чувствительными к регистру ( case sensitive ) — заглавные и маленькие буквы в именах различаются.

Расширения (суффиксы) имён

Термин «расширение» сохранился со времён, когда операционная система Microsoft DOS была самой популярной для персональных компьютеров типа IBM PC. Файловая система DOS позволяла в именах файлов не более 11 знаков; первые не более 8 из них считались основным именем (base name), а не более 3 последних — расширением ( extension ) имени. Для отделения основной части имени от расширения использовалась точка (кроме специальных имён — . и .. ). Сама точка не считалась частью имени. Имена WORK и WORK. означали одно и то же. Вот пример имени файла наиболее длинного имени: AUTOEXEC.BAT . Многие программы для DOS и Windows придают расширениям чересчур большое значение — например, Microsoft Word будет упорно пытаться открыть файл с расширением .DOC как документ в его родном формате, даже если в файле содержится простой текст. В файловых системах Linux точка — такая же часть имени, что и любой другой символ. Теперь уже WORK и WORK. станут ссылаться на разные файлы. Если угодно, можно по-прежнему называть часть имени файла, следующую за точкой, расширением, хотя точек в имени может быть и несколько. Например, файловому архиву в формате tar , сжатому компрессором lzma , часто дают суффикс .tar.lzma . Большинство программ для Linux не связывают расширение имени файла с его содержимым, либо связывают, но позволяют явно указать тип содержимого файла с помощью опций. Тот же Perl будет запускать свои программы по имени, независимо от того, какое расширение использовано — .pl , .plx или .cgi , и есть ли оно вообще.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лучшее предложение, которое я мог придумать, - позволить пользователю называть файл так, как ему нравится. Используя обработчик ошибок, когда приложение пытается сохранить файл, перехватите любые исключения, предположите, что виновато имя файла (очевидно, после того, как убедитесь, что путь сохранения был в порядке), и запросите у пользователя новое имя файла. Для достижения наилучших результатов поместите эту процедуру проверки в цикл, который продолжается до тех пор, пока пользователь не поймет правильно или не сдастся. Лучше всего сработал для меня (по крайней мере, в 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, чтобы создать имя файла, он пропускает недопустимые символы, за исключением косой черты, которая преобразуется в минус.

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

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

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

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

Термином "имена файловых объектов" обозначаются имена файлов и каталогов, далее для краткости используется термин "имена файлов", при этом правила именования для файлов и каталогов одинаковы. Далее п одразумевается, что используется стандартная для Astra Linux файловая система ext4.

Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и 2
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.5)
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)

Имена файлов в Astra Linux чувствительны к регистру. То есть, например: AstraLinux, Astralinux, и astralinux - это три разных имени файлов.

Для имен файлов, содержащих символы кириллицы, используется кодировка UTF-8. Следует помнить, что при использовании этой кодировки одному символу кириллицы соответствует 2 байта, другим символам (например, диакритическим) может соответствовать до четырех байт.

Имена файлов в Linux могут быть длиной до 255 байт.

Полная длина пути к файлу (включая имя файла) не должна превышать 4096 байт.

При использовании кириллицы и диакритических символов следует помнить, что одному такому символу соответствует до четырех байт. В частности, увеличение длинны имен при их перекодировке может привести к затруднениям при копировании или разархивировании файлов из систем, использующих кодировку CP-1251 или KOI-8, в системы с кодировкой UTF-8.

При архивировании могут действовать ограничения, зависящие от используемой системы архивирования (и, в некоторых случаях, от типов архивируемых файлов). Более подробную информацию см. в документации на используемые архиваторы. Так, например:

  • архиватор tar:
    • версия gnu - длина не ограничена (эта версия входит в дистрибутивы современных версия Astra Linux);
    • версия v7 - максимальная длина полного имени файла 99 байт;
    • версия ustar - максимальная длина полного имени файла 256 байт, максимальная длина имени символьной ссылки - 100 байт;

    При использовании оптических дисков (файловая система ISO 9660) действуют следующие ограничения:

    • длина пути не более 1024 байта;
    • длина имени файла:
      • оригинальная версия ISO9660 - 32 байта;
      • версия файловой системы Joliet - 128 байт;
      • версия файловой системы Rockridge - 255 байт.

      Некоторые символы или последовательности символов зарезервированы для специального использования, и их не рекомендуется применять в именах файлов:

      При сравнении имен файлов - любой символ из указанного в квадраных скобках диапазона, например:

      • [a-z] любая латинская буква в нижнем регистре;
      • [A-Z] любая латинская буква в верхнем регистре;
      • 7 любая десятичная цифра;
      • [0-9A-Fa-f] любая шестнадцатиричная цифра (в любом регистре);
      • [a-zA-Z0-9] любая латинская буква в любом регистре или десятичная цифра.

      Минимальный безопасный набор симоволов для использования в именах файлов:

      • буквы (как латиницы, так и кириллицы, в любом регистре);
      • цифры;
      • символ "." (точка);
      • символ "_" (подчеркивание)
      • символ "-" (тире).

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

      В Astra Linux можно создать имена файлов содержащие любой символ, включая непечатные (невидимые) символы и метасимволы. Далее приведены некоторые приемы для работы с такими именами файлов.

      Автозавершение

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

      Замена невидимых символов

      Для указания файлов с невидимыми символами можно использовать символ "*", обозначающий любой символ, например, переименовать файл с именем badname, содержащим невидимый символ:

      Экранирование метасимволов

      Для управления файлами с именами, содержащими метасимволы, можно использовать:

      • символы "одинарная кавычка", внутри которых метасимволы потеряют свои специальные значения;
      • символ "обратная косая черта", отменяющий специальное значение следующего за ним символа;

      позволит переименовать файл с "неудобным" именем *Astra*Linux* в файл с другим "неудобным" именем, содержащим пробел.

      Для имен файлов, начинающихся с символа "минус" можно использовать указание их имени относительно текущего каталога:

      Символы "./" в начале имени файла обозначают "текущий каталог", и позволяют скрыть лидирующее тире, чтобы команда rm не воспринимала имя файла как опцию.

      Читайте также: