Привет, я ищу символ в файловых системах Unix и Windows, который не разрешен в именах файлов и каталогов, и мне было интересно, есть ли такой символ (я заметил, что * и% разрешены)?
Файловой системы Unix не существует. И файловая система "Windows" не подходит. Вы имеете в виду NTFS, FAT16, FAT32, ext2, ext3, ext4 и т.д. У каждого есть свои ограничения на допустимые символы в именах.
Кроме того, заголовок вашего вопроса и вопрос относятся к двум совершенно разным концепциям? Вы хотите знать о подмножестве допустимых символов или хотите знать, какие подстановочные знаки могут использоваться в обеих системах?
http://en.wikipedia.org/wiki/Ext3 утверждает, что в именах файлов разрешены все байты, кроме NULL и '/'.
http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx описывает общий случай для допустимых имен файлов «независимо от файловой системы». В частности, зарезервированы следующие символы <>: "/ \ |? *
Windows также накладывает ограничения на неиспользование имен устройств для файлов: CON, PRN, AUX, NUL, COM1, COM2, COM3 и т. Д.
Большинство команд в операционных системах на базе Windows и Unix принимают * как подстановочный знак. Windows принимает% как одинарные подстановочные знаки, тогда как оболочки для систем Unix используют? как подстановочный знак с одним символом.
Наиболее файловые системы достаточно разрешающие: например, все NTFS, extN, btrfs, XFS и ReiserFS разрешают все, кроме 1) нулевого байта и 2) косой черты /
.
В Операционная система могут иметь свои ограничения. В частности, Win320 API запрещает * ?
как подстановочные знаки, \ /
как разделители путей, :
как разделитель потока, и < > | "
без уважительной причины1. Также запрещены управляющие символы ASCII (диапазон 0x00-0x1F).
В Unix расширение подстановочных знаков выполняется оболочкой и glob()
функция. В Windows это работа драйвера файловой системы, поэтому *
и ?
нельзя использовать в именах файлов.
0 У меня нет информации о API POSIX и OS / 2, предлагаемых Windows.
1 Oни являются специальный в оболочке командной строки (cmd.exe
), но он, безусловно, мог (и фактически делает) обрабатывать экранирование, как это делают оболочки Unix.
Это действительно зависит от файловой системы, но большинство файловых систем Unix допускают любой байт, кроме NULL и /. NTFS допускает все, кроме NULL и \ /: *? «<> |.
В Википедии есть очень полезная сравнительная таблица: http://en.wikipedia.org/wiki/Comparison_of_file_systems
Тем не менее, почти все оболочки сначала распознают * как подстановочный знак, а символ в имени файла только при экранировании. Почему бы не использовать использование *?
*
должен работать как подстановочный знак в обоих, но это оболочка или вызванная команда, которая расширяет эти вещи, а не сама файловая система. Bash, например, расширит *
в список файлов в текущей папке, разделенных пробелами.
Я не думаю, что какая-либо файловая система прямо запрещает любой символ. Вполне возможно создать имена файлов на ext2 или NTFS с такими именами, как *&(
. Графический интерфейс Windows может вам не позволять, но вы можете сделать это в Cygwin, поскольку базовая файловая система позволяет это.