Логотип

Почему при переименовании с учетом регистра в файловой системе exFAT возникают ошибки (и как их исправить)

Почему при переименовании с учетом регистра в файловой системе exFAT возникают ошибки (и как их исправить)

Переименование File в file работает в файловой системе ext4, но не работает в exFAT. В этом руководстве мы расскажем, почему exFAT считает оба имени идентичными, как работает таблица регистров Unicode и как проще всего выполнить переименование с сохранением регистра.

 

exFAT не позволяет менять только регистр букв

Вы открываете терминал и вводите простую команду:

mv Desktops desktops

 

Вместо переименования папки вы получаете сообщение об ошибке:

mv: cannot move 'Desktops' to a subdirectory of itself, 'desktops/Desktops'

 

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

Хорошая новость в том, что с mv командой все в порядке. Настоящая причина кроется в вашей файловой системе.

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

 

Что такое exFAT?

exFAT (расширенная таблица размещения файлов) — это файловая система, разработанная Microsoft для флеш-накопителей, SD-карт и внешних устройств хранения данных.

Она поддерживает файлы и разделы гораздо большего размера, чем FAT32, что делает ее популярным выбором для USB-накопителей, портативных твердотельных накопителей и карт памяти. Сегодня exFAT поддерживается в Windows, macOS и Linux, что делает ее одной из самых простых в использовании файловых систем при переносе устройств хранения данных между разными операционными системами.

Однако exFAT также следует некоторым правилам именования файлов в стиле Windows. Одно из таких правил заключается в том, что при сравнении имён файлов игнорируются прописные и строчные буквы. Именно из-за этого при замене Desktops на desktops поведение файловой системы будет отличаться от большинства файловых систем Linux.

Когда вы, скорее всего, столкнетесь с этим?

Чаще всего такое поведение наблюдается при работе с USB-накопителями, портативными твердотельными накопителями, SD-картами или картами памяти, отформатированными в файловой системе exFAT.

Если вы работаете с внутренним диском системы Linux, то, скорее всего, используете другую файловую систему, например ext4, поэтому переименование с учетом только регистра обычно работает как надо.

 

Почему это происходит: краткий ответ

Если на вашем диске используется exFAT, файловая система воспринимает эти имена как одинаковые:

  • Desktops
  • desktops
  • DESKTOPS

 

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

Такое поведение называется без учета регистра, но с сохранением регистра.

Из-за этого изменить только регистр букв не так просто, как кажется.

 

Почему ext4 может переименовывать файлы, а exFAT — нет

Многие считают, что у ext4 функция переименования лучше, чем у exFAT.

Это не так.

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

Прежде чем mv что-либо переименовать, она задает файловой системе простой вопрос:

«Существует ли уже файл или папка с указанным именем?»

 

Ответ полностью зависит от того, как файловая система сравнивает имена.

 

Как ext4 ищет имена

Представьте, что каталог — это список имен файлов. Когда ext4 просматривает этот список, она сравнивает каждое имя файла в точности так, как оно хранится.

Это означает, что это три совершенно разных имени:

  • Desktops
    desktops
    DESKTOPS

 

Предположим, ваш каталог содержит:

Desktops

 

Теперь ты бежишь:

mv Desktops desktops

 

ext4 ищет имя файла, которое в точности соответствует desktops.

Оно не найдено.

С точки зрения ext4:

  • Desktops существует.
  • desktops не существует.

 

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

Переименование выполняется за один шаг.

 

Как exFAT ищет имена

exFAT работает совсем по-другому.

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

Для этого exFAT использует специальную структуру данных, хранящуюся в самой файловой системе, — таблицу регистронезависимых символов.

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

 

Что такое таблица преобразования в верхний регистр?

Таблица преобразования в верхний регистр — одна из уникальных структур, определенных файловой системой exFAT.

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

Например, таблица содержит такие сопоставления:

a → A
b → B
d → D
é → É
δ → Δ

 

Таблица содержит тысячи сопоставлений Юникода, а не только английского алфавита.

Поскольку сопоставления хранятся в файловой системе, каждая операционная система может сравнивать имена файлов по одним и тем же правилам.

 

Как exFAT сравнивает имена файлов

Представьте, что в вашем каталоге есть такая папка:

Desktops

 

Теперь ты бежишь:

mv Desktops desktops

 

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

В общих чертах это выглядит так:

Сохраненное имя:

Desktops
    ↓
DESKTOPS

New name:

desktops
    ↓
DESKTOPS

 

После преобразования оба названия становятся:

DESKTOPS

 

С точки зрения exFAT, они идентичны.

Поэтому, когда mv спрашивает,

«desktops уже существует?»

 

файловая система отвечает,

— Да.

 

Потому что после нормализации так и происходит.

 

Зачем нужна таблица преобразования регистра

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

Ответ кроется в Юникоде.

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

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

Это дает некоторые преимущества.

Во-первых, каждая операционная система сравнивает имена файлов по одним и тем же правилам.

Во-вторых, сопоставления Unicode могут меняться без перестройки файловой системы.

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

Это удивительно элегантное решение.

 

Почему exFAT по-прежнему сохраняет заглавные буквы

Хотя exFAT игнорирует регистр букв при сравнении, она сохраняет исходное имя файла в точности таким, каким вы его ввели.

Предположим, вы создали:

MyHolidayPhotos

 

В каталоге появится:

MyHolidayPhotos

 

Это не меняет регистр.

Однако при поиске файла все эти названия совпадают:

MyHolidayPhotos
myholidayphotos
MYHOLIDAYPHOTOS

 

Вот почему файловая система exFAT описывается как сохраняющая регистр, но нечувствительная к регистру.

 

Почему ошибка выглядит так странно

Теперь вернемся к исходной команде.

mv Desktops desktops

 

Прежде чем что-либо переименовать, mv проверяет, существует ли уже конечная папка.

В файловой системе exFAT сообщается, что desktops уже существует, поскольку имена сравниваются без учета регистра.

В этот момент mv предполагает, что вы хотите переместить каталог Desktops в существующий каталог с именем desktops.

По сути, происходит что-то вроде этого:

Desktops/
└── Desktops/

 

Это привело бы к созданию каталога внутри самого себя.

Поскольку это невозможно, mv останавливается и выводит сообщение:

mv: cannot move 'Desktops' to a subdirectory of itself, 'desktops/Desktops'

 

Команда не сбита с толку. Она просто доверяет тому, что сообщает ей файловая система.

Сообщение об ошибке исходит от mv, но такое поведение связано с тем, как exFAT сравнивает имена файлов.

 

Переименование файлов и папок, отличающихся только регистром букв, в файловой системе exFAT

Самое простое решение — использовать временное имя.

mv Desktops temp-desktops
mv temp-desktops desktops

 

Временное имя устраняет конфликт. Как только исходное имя перестает существовать, второе переименование проходит успешно.

Хотя для этого нужно выполнить две команды, это самый простой и надежный способ работы с файловой системой exFAT.

Другие примеры

Пример 1: папка «Фотографии»

Предположим, на вашем внешнем твердотельном накопителе есть:

photos2026

 

Ты хочешь:

Photos2026

 

Если вы попытаетесь переименовать его с помощью команды mv, как показано ниже:

mv photos2026 Photos2026

 

Это не сработает.

Вместо этого используйте временное имя для переименования файлов на exFAT, как показано ниже:

mv photos2026 Photos-temp
mv Photos-temp Photos2026

Пример 2: музыкальная папка

Текущая папка:

RockMusic

 

Желаемое имя:

rockMusic

 

Опять же, используйте промежуточное имя.

mv RockMusic rock-temp
mv rock-temp rockmusic

 

Тот же трюк работает с файлами.

 

Происходит ли это во всех файловых системах Linux?

Нет. Большинство файловых систем Linux по умолчанию чувствительны к регистру.

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

Project
project
PROJECT

 

Таким образом, это работает без каких-либо дополнительных действий:

mv Project project

 

То же самое в целом справедливо для Btrfs и XFS.

 

Какие файловые системы игнорируют регистр символов?

Файловая системаЧувствительность к регистру по умолчанию?
ext4ДА
BtrfsДА
XFSДА
exFATНЕТ
FAT32НЕТ
NTFS (стандартное монтирование в Linux)Обычно Нет

 

Если вы в основном используете внешние USB-накопители, то, скорее всего, столкнетесь с этой проблемой, поскольку многие портативные накопители отформатированы в файловой системе exFAT.

 

Как проверить файловую систему

Если вы не знаете, какая файловая система используется на вашем накопителе, выполните следующую команду:

df -T .

 

Или:

findmnt -T .

 

Или, если вам нужен только тип файловой системы:

findmnt -T .

 

Если на выходе отображается:

exfat

 

тогда такое поведение является ожидаемым.

 

Основные выводы

Замена только прописных букв на строчные выглядит как простое переименование.

Однако exFAT сравнивает имена файлов иначе, чем большинство файловых систем Linux.

Помните об этих моментах:

  • exFAT сравнивает имена файлов без учета регистра.
  • Для этого используется встроенная таблица Unicode в верхнем регистре.
  • Desktopsdesktops, и DESKTOPS считаются одним и тем же именем.
  • mv доверяет файловой системе при проверке того, существует ли уже файл назначения.
  • В результате переименование с учетом только регистра в exFAT обычно не работает.
  • Переименование через временное имя — самое простое и надежное решение.

 

Как только вы поймёте, как exFAT ищет имена файлов, сообщение об ошибке перестанет казаться загадочным. Это просто результат особенностей структуры файловой системы.

 

Попробуйте сами, без диска exFAT (необязательно)

Этот раздел необязательный. Для выполнения инструкций вам не понадобится внешний USB-накопитель или твердотельный накопитель. Вместо этого вы можете создать временную файловую систему exFAT внутри образа диска с помощью циклического устройства Linux.

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

 

Создайте тестовую среду

Сначала установите необходимые инструменты:

sudo apt update
sudo apt install exfatprogs

 

Затем создайте образ диска размером 100 МБ:

truncate -s 100M exfat_test.img

 

Подключите образ к свободному устройству и сохраните присвоенное имя устройства в переменной оболочки:

LOOP=$(sudo losetup --find --show exfat_test.img)

 

Создайте файловую систему exFAT:

sudo mkfs.exfat "$LOOP"

 

Создайте точку монтирования и подключите файловую систему:

mkdir mnt_exfat
sudo mount -t exfat \
 -o uid=$(id -u),gid=$(id -g) \
 "$LOOP" mnt_exfat

 

Параметры монтирования uid и gid делают вашего пользователя владельцем смонтированной файловой системы exFAT. Это позволяет создавать, переименовывать и удалять файлы без использования sudo, что упрощает понимание примеров в этом руководстве.

 

Проверить команды

Перейти к подключенной файловой системе:

cd mnt_exfat

 

Создайте тестовый каталог:

mkdir Desktops

 

Теперь попробуйте выполнить команду, описанную в этой статье:

mv Desktops desktops

 

Вы должны увидеть то же поведение, что и при работе с реальным USB-накопителем или SSD, отформатированным в файловой системе exFAT.

Renames Fail on exFAT.png

 

Очистить

Когда закончите, размонтируйте файловую систему, отключите устройство-контейнер и удалите временные файлы:

cd ..

sudo umount mnt_exfat
sudo losetup -d "$LOOP"

rm exfat_test.img
rmdir mnt_exfat

 

Нужен ли вам exfat-fuse?

В современных дистрибутивах Linux обычно нет.

В ядро Linux встроен собственный драйвер exFAT, начиная с версии 5.4, и большинство современных дистрибутивов используют его по умолчанию. В большинстве случаев вам будет достаточно установить exfatprogs, поскольку он предоставляет такие утилиты, как:

  • mkfs.exfat
  • fsck.exfat

 

Старые версии Linux часто зависели от:

  • exfat-fuse
  • fuse3

 

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

 

Часто задаваемые вопросы

Почему mv пишет «подкаталог самого себя», хотя я изменил только регистр букв?

Потому что exFAT обрабатывает Desktops и desktops как одно и то же имя каталога. Когда mv проверяет, существует ли пункт назначения, файловая система сообщает, что существует. mvзатем предполагается, что вы пытаетесь переместить каталог в себя, и выводится соответствующее сообщение об ошибке.

Происходит ли это на файловых системах ext4, Btrfs или XFS?

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

Это влияет на Windows и macOS?

Да. exFAT по умолчанию не чувствительна к регистру, поэтому Windows, macOS и Linux при обращении к диску с файловой системой exFAT сравнивают имена файлов по одним и тем же правилам.

Можно ли сделать exFAT чувствительной к регистру?

Нет. Поиск файлов без учета регистра является частью спецификации файловой системы exFAT. Linux не может включить чувствительность к регистру с помощью параметра монтирования или настройки конфигурации.

Скопирует ли мои файлы двухэтапное переименование?

A: Нет. Обе команды просто переименовывают каталог в той же файловой системе. Они не копируют содержимое и не создают каталог заново.

Вопрос: переименование по-прежнему не работает. Что мне нужно проверить?

О: Убедитесь, что временное имя еще не существует. Также проверьте, есть ли у вас разрешение на запись в каталог и находятся ли источник и место назначения в одной файловой системе exFAT.

Вопрос: нужен ли мне USB-накопитель с файловой системой exFAT, чтобы попробовать этот способ?

О: Нет. Вы можете создать временную файловую систему exFAT внутри образа диска с помощью циклического устройства Linux. В дополнительном разделе этого руководства показано, как его настроить, протестировать и безопасно удалить.

 

Заключение

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

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

Понимание этой схемы помогает объяснить не только то, почему mv Desktops desktops не работает, но и то, почему двухэтапное переименование работает всегда.

Редактор: AndreyEx

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

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

10 + 5 =

Это может быть вам интересно


Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала