Меню Рубрики

Символы запрещенные в имени файла linux

Символы запрещенные в имени файла linux

4.1. Файлы и их имена

Глава 4. Знакомство с файловой системой ext2fs

Теперь, когда вы научились запускать Linux и завершать работу с этой системой, надо познакомиться с устройством одной из основных ее частей — файловой системы. Файловая система — это структура, с помощью которой ядро операционной системы предоставляет пользователям (и процессам) ресурсы долговременной памяти системы, т. е. памяти на различного вида долговременных носителях информации — жестких дисках, магнитных лентах. CD-ROM и т. п.

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

В настоящем разделе мы рассмотрим файловые системы только с той стороны, которая обращена к пользователям. Обратную, невидимую для пользователей, сторону файловой системы мы будем изучать в гл. 16 . Надо еще, может быть, отметить, что речь пойдет конкретно о файловой системе типа ext2fs, основном на данный момент типе файловых систем для Linux (существуют и другие типы файловых систем, об этом тоже будет сказано в гл. 16 ).

4.1. Файлы и их имена

Компьютер есть не что иное, как инструмент для обработки информации. А информация в любой ОС хранится на носителях в виде файлов. С точки зрения ОС файл представляет собой непрерывный поток (или последовательность) байтов определенной длины. Внутренний формат файла операционную систему не интересует. Но ОС должна дать файлу какое-то имя, с помощью которого пользователь, а точнее, программы-приложения, будут обращаться к файлу. Как организовать это обращение — дело файловой системы, пользователя это чаще всего не интересует. Поэтому с точки зрения пользователя файловая система выглядит как логическая структура каталогов и файлов.

Имена файлов в Linux могут иметь длину до 255 символов и состоять из любых символов, кроме символа с кодом 0 и символа / (слэша). Однако имеется еще ряд символов, которые имеют в оболочке shell специальное значение и которые поэтому не рекомендуется включать в имена. Это следующие символы:

Можно также заключить имя файла или каталога с такими символами в двойные кавычки. Например, для создания каталога с именем «My old files» следует использовать команду:

[user]$ mkdir «My old files»

[user]$ mkdir My old files

создаст каталог с именем «My».

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

Но к точке сказанное не относится , и в Linux часто ставят более одной точки в именах файлов, например, This_is.a.forth-chapter_of_my_book.about.Linux. При этом теряет смысл такое понятие (принятое в DOS), как расширение имени файла, хотя все же часто последние части имени, отделенные точками, используют для обозначения файлов каких-то особых типов (например, .tar.gz используется для обозначения сжатых архивов). Но исполняемые и неисполняемые файлы в Linux распознаются не по расширениям имен файлов. Для этого существуют другие признаки, о которых мы скажем чуть позже. Точка имеет особое значение в именах файлов. Если она является первым символом имени, то данный файл считается скрытым для некоторых команд, например, он не показывается при выполнении команды ls .

В Linux различаются символы верхнего и нижнего регистра в именах файлов. Поэтому FILENAME.tar.gz и filename.tar.gz вполне могут существовать одновременно и являться именами разных файлов.

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

Каждому файлу в Linux соответствует так называемый «индексный дескриптор» файла, или «inode», (однозначного перевода этого термина на русский язык не существует, в разных книгах эту структуру называют по-разному). Именно индексный дескриптор содержит всю необходимую файловой системе информацию о файле, включая информацию о расположении частей файла на носителе, типе файла и многое другое. Индексные дескрипторы файлов содержатся в специальной таблице (inode table), которая создается при создании файловой системы на носителе. Каждый логический и физический диск имеет собственную таблицу индексных дескрипторов. Дескрипторы в этой таблицы пронумерованы последовательно, и именно номер дескриптора файла является его истинным именем в системе (этот номер мы будем называть индексом файла). Однако для человека такая система имен неудобна. Сможете ли вы вспомнить, что сохранили в файле с номером 56734? Поэтому файлам даются еще «человеческие» имена, и помимо этого файлы группируются в каталоги.

Приведенная выше информация нужна здесь только для того, чтобы сказать, что имя любого файла в Linux является ни чем иным, как ссылкой на индексный дескриптор файла. Поэтому каждый файл может иметь сколько угодно разных имен. Эти имена называют еще «жесткими» ссылками. Когда вы удаляете файл, имеющий несколько разных имен — жестких ссылок, то фактически удаляется только одна ссылка — та, которую вы указали в команде удаления файла. Даже когда вы удаляете последнюю ссылку, это еще может не означать удаления содержимого файла — если файл еще используется системой или каким-то приложением, то он сохраняется до тех пор, пока он не «освободится».

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

ln имя_существующего_файла новое_имя

[user]$ ln /home/howto/font-HOWTO-ru/Font-HOWTO.html

здесь и вообще в системе означает домашний каталог пользователя, о котором будет сказано чуть дальше). Теперь можно вместо длинного имени /home/howto/font-HOWTO-ru/Font-HOWTO.html использовать просто

/fonts.html . Подробнее о команде ln вы можете прочитать на странице интерактивного руководства man .

Число жестких ссылок на файл (т. е. разных имен файла) можно узнать, выполнив команду ls с параметром –l . Сразу за перечислением прав доступа к файлу следует число, которое и обозначает число жестких ссылок на файл:

drwxr-xr-x 2 user users 1024 Jul 1 2000 Autostart

-rw-r—r— 1 user users 230 Sep 14 1999 Printer.kdelnk

-rw-r—r— 1 user users 159 Sep 15 1999 Red Hat

В. Костромин (kos at rus-linux dot net) — 4.1. Файлы и их имена Версия для печати

Источник

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

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

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

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

12 ответов

«полное руководство» запрещенных символов имени файла не будет работать на 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 сообщить вам ответ-попытаться переименовать файл через Проводник и ввести / для нового имени. Windows появится окно сообщения, сообщающее вам список незаконных символов.

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Символические и жесткие ссылки linux
  • Сжать папку в архив linux
  • Сеть предприятия на базе linux
  • Сетевые учетные записи linux
  • Сетевые карты для kali linux