Как файловые системы без учета регистра отображают имена файлов как в верхнем, так и в нижнем регистре?

12

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

В файловой системе без учета регистра, скажем, extFAT или HFS + (особенно без учета регистра), как файловая система обеспечивает доступ к одному и тому же файлу как в верхнем, так и в нижнем регистре версий имени файла.

Например:

$ cd ~/Documents
$ pwd
/home/derp/Documents

$ cd ../documents
$ pwd
/home/derp/documents

$ cd ../docuMents
$ pwd
/home/derp/docuMents

$ cd ../DOCUMENTS
$ pwd
/home/derp/DOCUMENTS

$ cd ../documentS
$ pwd
/home/derp/documentS

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

Другой пример:

$ ls ~/Documents
Derp.txt    another.txt    whatThe.WORLD

Здесь файловая система сообщает случай исходного имени файла, созданного пользователем или программой.

В какой точке стека файловой системы сохраняется понятное человеку имя файла, как оно было создано (например, в верхнем и нижнем регистре), чтобы к нему можно было получить доступ любой комбинацией правильных символов ASCII в верхнем и нижнем регистре? Это просто трюк с регулярными выражениями или что-то еще происходит?

РЕДАКТИРОВАТЬ: Похоже, что поведение, которое мне интересно, обнаруживается в сохраняющих регистр нечувствительных к регистру файловых систем после некоторых дополнительных исследований ...

111 ---
источник
Не пишу это как ответ, потому что я точно не знаю больше, но я верю, что вы не можете иметь ~ / Documents и ~ / documents в этой файловой системе. Но когда вы cd ~ / Documents или ~ / документируете, вы идете в одно и то же место, и ваша оболочка «играет хорошо», вспоминая, что вы напечатали. С другой стороны, некоторые ФС хранят так, как они были созданы в aux. кусок данных. Например, сохранение ~ / Documents в таблице поиска, но запись в FS как ~ / documents. По сути, создается иллюзия, что файловая система заботится о корпусе, когда это не так.
Coteyr
Из того, что я наблюдал, в случае, если каталог содержит два идентичных имени файла, за исключением случая, файловые системы, не чувствительные к регистру, могут отвечать на запрос для данного файла, произвольно выбирая его. Такие ситуации могут возникать, если правила преобразования в верхний / нижний регистр изменяются после создания файла.
суперкат
Классная информация о сохранении кейса NTFS: superuser.com/questions/364057/why-is-ntfs-case-sensitive
канадский Лука

Ответы:

14

Независимая от регистра файловая система просто означает, что всякий раз, когда файловая система должна спросить «относится ли A к тому же файлу / каталогу, что и B?» он сравнивает имена файлов / каталогов, игнорируя различия в верхнем / нижнем регистре (именно то, что количество различий в верхнем / нижнем регистре зависит от файловой системы - это неочевидно, когда вы выйдете за пределы ASCII). Чувствительная к регистру файловая система не игнорирует эти различия.

Сохраняющая регистр файловая система хранит имена файлов как дано. Не сохраняющая регистр файловая система этого не делает; как правило, он преобразует все буквы в верхний регистр перед их сохранением (теоретически он может использовать строчные буквы или регистр RaNsOm NoTe, или что-то еще, но AFAIK все реальные буквы используют верхний регистр).

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

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

Когда вы используете файловую систему без учета регистра в окне Unix, различные утилиты будут делать странные вещи, потому что Unix традиционно использует чувствительные к регистру файловые системы - поэтому они не ожидают Document1и document1будут одним и тем же файлом.

В данном pwdслучае вы видите, что по умолчанию он просто выводит путь, который вы фактически использовали для доступа к каталогу. Так что, если вы попали туда через cd DirName, он будет использоваться DirNameв выводе. Если вы попали туда через DiRnAmE, вы увидите DiRnAmEна выходе. Bash делает это, отслеживая, как вы попали в текущий каталог в $PWDпеременной окружения. В основном это для символических ссылок (если вы cdперейдете по символической ссылке, вы увидите символическую ссылку в вашей pwd, хотя она на самом деле не является частью пути к вашему текущему каталогу). Но это также дает несколько странное поведение, которое вы наблюдаете в файловых системах без учета регистра. Я подозреваю, что pwd -Pдаст вам имя каталога, используя регистр, сохраненный на диске, но не проверенный.

derobert
источник
Я мог бы знать, что вы победили меня в этом! (голосование одобрено)
Fabby