Почему при переименовании с учетом регистра в файловой системе 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, файловая система воспринимает эти имена как одинаковые:
DesktopsdesktopsDESKTOPS
Другими словами, 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
Временное имя устраняет конфликт. Как только исходное имя перестает существовать, второе переименование проходит успешно.
Другие примеры
Пример 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 в верхнем регистре.
Desktops,desktops, и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.exfatfsck.exfat
Старые версии Linux часто зависели от:
exfat-fusefuse3
Эти пакеты обеспечивали поддержку файловой системы 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