Đổi tên File thành file trên ext4 thì được, nhưng trên exFAT filesystem thì báo lỗi. Trong bài uide này, chúng ta sẽ tìm hiểu tại sao exFAT coi hai tên đó là giống hệt nhau, cách hoạt động của Bảng chữ hoa Unicode, và cách đơn giản nhất để thực hiện đổi tên chỉ khác kiểu chữ-only.
exFAT Không Cho Phép Bạn Chỉ Thay Đổi Kiểu Chữ
Bạn mở terminal và chạy một lệnh đơn giản:
mv Desktops desktops
Thay vì đổi tên thư mục, bạn nhận được lỗi này:
mv: cannot move 'Desktops' to a subdirectory of itself, 'desktops/Desktops'
Thoạt nhìn, lỗi này có vẻ khó hiểu. Rốt cuộc, bạn chỉ muốn đổi một chữ hoa thành chữ thường.
Tin tốt là không có gì sai với lệnh mv. Lý do thực sự nằm ở filesystem của bạn.
Hãy xem tại sao điều này xảy ra, exFAT hoạt động như thế nào bên trong, và tại sao lỗi này thực ra lại hợp lý.
exFAT Là Gì?
exFAT (Extended File Allocation Table) là một filesystem mà Microsoft thiết kế cho ổ flash, thẻ SD và các thiết bị lưu trữ ngoài.
Nó hỗ trợ các file và phân vùng lớn hơn nhiều so với FAT32, khiến nó trở thành lựa chọn phổ biến cho ổ USB flash, SSD di động và thẻ nhớ. Ngày nay, Windows, macOS và Linux đều hỗ trợ exFAT, biến nó thành một trong những filesystem dễ sử dụng nhất khi bạn di chuyển thiết bị lưu trữ giữa các hệ điều hành khác nhau.
Tuy nhiên, exFAT cũng tuân theo một số quy tắc đặt tên Windows-style filename. Một trong những quy tắc đó là nó bỏ qua chữ hoa và chữ thường khi so sánh filename. Chính thiết kế đó là lý do tại sao việc đổi Desktops thành desktops lại hoạt động khác so với hầu hết các filesystem Linux.
Khi Nào Bạn Dễ Gặp Điều Này?
Bạn sẽ thường gặp hành vi này nhất khi làm việc với ổ USB flash, SSD di động, thẻ SD hoặc thẻ nhớ được định dạng là exFAT.
Nếu bạn đang làm việc trên ổ đĩa trong của hệ thống Linux, có thể bạn đang sử dụng một filesystem khác như ext4, vì vậy việc đổi tên chỉ khác kiểu chữ-only thường hoạt động như mong đợi.
Tại Sao Điều Này Xảy Ra: Câu Trả Lời Ngắn Gọn
Nếu ổ đĩa của bạn sử dụng exFAT, filesystem coi các tên này là giống nhau:
DesktopsdesktopsDESKTOPS
Nói cách khác, exFAT bỏ qua chữ hoa và chữ thường khi so sánh filename. Tuy nhiên, nó vẫn nhớ cách viết hoa bạn đã dùng và hiển thị filename chính xác như bạn đã nhập.
Hành vi này được gọi là không phân biệt chữ hoa chữ thường nhưng vẫn giữ nguyên kiểu chữ (case-insensitive but case-preserving).
Bởi vì điều đó, việc chỉ thay đổi kiểu chữ không đơn giản như vẻ ngoài của nó.
Tại Sao ext4 Có Thể Đổi Tên Được Còn exFAT Thì Không
Nhiều người cho rằng ext4 có tính năng đổi tên tốt hơn exFAT.
Thực tế không phải vậy.
Cả hai filesystem đều hỗ trợ đổi tên file và thư mục. Sự khác biệt nằm ở cách chúng tra cứu filename.
Trước khi mv đổi tên bất cứ thứ gì, nó hỏi filesystem một câu hỏi đơn giản:
"Một file hoặc thư mục có tên đích đã tồn tại chưa?"
Câu trả lời phụ thuộc hoàn toàn vào cách filesystem so sánh tên.
Cách ext4 Tra Cứu Tên
Hãy nghĩ về một thư mục như một danh sách các filename. Khi ext4 tìm kiếm trong danh sách đó, nó so sánh mọi filename chính xác như nó được lưu trữ.
Điều đó có nghĩa là đây là ba tên hoàn toàn khác nhau:
Desktops
desktops
DESKTOPS
Giả sử thư mục của bạn chứa:
Desktops
Bây giờ bạn chạy:
mv Desktops desktops
ext4 tìm kiếm một filename khớp chính xác với desktops.
Nó không tìm thấy.
Theo quan điểm của ext4:
Desktopstồn tại.desktopskhông tồn tại.
Vì không có xung đột, filesystem chỉ cần cập nhật mục nhập thư mục với tên mới.
Việc đổi tên thành công trong một bước duy nhất.
Cách exFAT Tra Cứu Tên
exFAT hoạt động rất khác.
Thay vì so sánh trực tiếp filename, trước tiên nó chuyển đổi cả hai tên thành một dạng chung trước khi so sánh.
Để làm điều này, exFAT sử dụng một cấu trúc dữ liệu đặc biệt được lưu trữ bên trong chính filesystem gọi là Up-case Table.
Không giống như ext4, việc so sánh không sử dụng các chữ cái gốc. Thay vào đó, cả hai tên được chuẩn hóa trước.
Up-case Table Là Gì?
Up-case Table là một trong những cấu trúc độc đáo được xác định bởi filesystem exFAT.
Nó chứa các ánh xạ Unicode chuyển đổi các ký tự chữ thường thành các ký tự chữ hoa tương đương.
Ví dụ, bảng chứa các ánh xạ như:
a → A
b → B
d → D
é → É
δ → Δ
Bảng chứa hàng nghìn ánh xạ Unicode, không chỉ bảng chữ cái tiếng Anh.
Bởi vì ánh xạ nằm bên trong filesystem, mọi hệ điều hành đều có thể so sánh filename bằng cách sử dụng chính xác cùng một quy tắc.
Cách exFAT So Sánh Tên Tệp
Hãy tưởng tượng thư mục của bạn chứa thư mục này:
Desktops
Bây giờ bạn chạy:
mv Desktops desktops
Trước khi so sánh các tên, exFAT chuyển đổi cả hai tên bằng Up-case Table.
Về mặt khái niệm, nó trông như thế này:
Stored name:
Desktops
↓
DESKTOPS
New name:
desktops
↓
DESKTOPS
Sau khi chuyển đổi, cả hai tên trở thành:
DESKTOPS
Theo quan điểm của exFAT, chúng giống hệt nhau.
Vì vậy, khi mv hỏi,
"
desktopsđã tồn tại chưa?"
filesystem trả lời,
"Có."
Bởi vì sau khi chuẩn hóa, nó có tồn tại.
Tại Sao Up-case Table Tồn Tại
Bạn có thể tự hỏi tại sao exFAT lưu trữ một bảng thay vì chỉ đơn giản là tự chuyển đổi các chữ cái.
Câu trả lời là Unicode.
Nhiều ngôn ngữ chứa các ký tự chữ hoa và chữ thường phức tạp hơn nhiều so với bảng chữ cái tiếng Anh.
Thay vì yêu cầu mọi hệ điều hành phải mã hóa cứng các quy tắc chuyển đổi Unicode giống nhau mãi mãi, exFAT lưu trữ bảng chuyển đổi bên trong filesystem.
Điều này mang lại một số lợi thế.
Đầu tiên, mọi hệ điều hành so sánh filename bằng cách sử dụng cùng một quy tắc.
Thứ hai, các ánh xạ Unicode có thể phát triển mà không cần thiết kế lại filesystem.
Cuối cùng, các hệ điều hành khác nhau vẫn tương thích với nhau vì tất cả đều sử dụng cùng một bảng chuyển đổi được lưu trữ trên đĩa.
Đó là một thiết kế thanh lịch một cách đáng ngạc nhiên.
Tại Sao exFAT Vẫn Giữ Nguyên Kiểu Chữ
Mặc dù exFAT bỏ qua kiểu chữ trong quá trình so sánh, nó vẫn lưu trữ filename gốc chính xác như bạn đã nhập.
Giả sử bạn tạo:
MyHolidayPhotos
Thư mục sẽ hiển thị:
MyHolidayPhotos
Nó không thay đổi cách viết hoa.
Tuy nhiên, khi tìm kiếm file, tất cả các tên này đều khớp:
MyHolidayPhotos
myholidayphotos
MYHOLIDAYPHOTOS
Đó là lý do tại sao exFAT được mô tả là giữ nguyên kiểu chữ (case-preserving) nhưng không phân biệt chữ hoa chữ thường (case-insensitive).
Tại Sao Lỗi Trông Có Vẻ Kỳ Lạ
Bây giờ chúng ta hãy quay lại lệnh ban đầu.
mv Desktops desktops
Trước khi đổi tên bất cứ thứ gì, mv kiểm tra xem đích đã tồn tại chưa.
Trên exFAT, filesystem báo cáo rằng desktops đã tồn tại vì nó so sánh tên mà không xem xét kiểu chữ.
Tại thời điểm đó, mv cho rằng bạn muốn di chuyển thư mục Desktops vào một thư mục hiện có tên là desktops.
Về mặt khái niệm, nó thấy một cái gì đó như thế này:
Desktops/
└── Desktops/
Điều đó sẽ tạo ra một thư mục bên trong chính nó.
Vì điều đó là không thể, mv dừng lại và in ra:
mv: cannot move 'Desktops' to a subdirectory of itself, 'desktops/Desktops'
Lệnh không bị nhầm lẫn. Nó chỉ đơn giản là tin tưởng những gì filesystem nói với nó.
Thông báo lỗi đến từ mv, nhưng hành vi đến từ cách exFAT so sánh filename.
Đổi Tên Tệp và Thư Mục Chỉ Khác Nhau Về Kiểu Chữ Trên exFAT
Giải pháp dễ nhất là sử dụng một tên tạm thời.
mv Desktops temp-desktops
mv temp-desktops desktops
Tên tạm thời loại bỏ xung đột. Khi tên gốc không còn tồn tại, lần đổi tên thứ hai sẽ thành công.
Mặc dù mất hai lệnh, đây là phương pháp đơn giản và đáng tin cậy nhất trên exFAT.
Thêm Ví Dụ
Ví Dụ 1: Thư Mục Photos
Giả sử SSD ngoài của bạn chứa:
photos2026
Bạn muốn:
Photos2026
Nếu bạn cố gắng đổi tên nó bằng lệnh mv như dưới đây:
mv photos2026 Photos2026
Nó sẽ thất bại.
Thay vào đó, hãy sử dụng một tên tạm thời để đổi tên file trên exFAT như dưới đây:
mv photos2026 Photos-temp
mv Photos-temp Photos2026
Ví Dụ 2: Thư Mục Music
Thư mục hiện tại:
RockMusic
Tên mong muốn:
rockmusic
Một lần nữa, hãy sử dụng một tên trung gian.
mv RockMusic rock-temp
mv rock-temp rockmusic
Thủ thuật tương tự cũng hoạt động cho file.
Điều Này Có Xảy Ra Trên Mọi Hệ Thống Tệp Linux Không?
Không. Hầu hết các filesystem Linux đều phân biệt chữ hoa chữ thường-sensitive theo mặc định.
Ví dụ, ext4 cho phép tất cả những thứ này tồn tại trong cùng một thư mục:
Project
project
PROJECT
Do đó, điều này hoạt động mà không cần bất kỳ bước bổ sung nào:
mv Project project
Điều tương tự cũng đúng với Btrfs và XFS.
Hệ Thống Tệp Nào Bỏ Qua Kiểu Chữ?
Nếu bạn chủ yếu sử dụng ổ USB ngoài, bạn có thể sẽ gặp phải hành vi này vì nhiều ổ di động được định dạng sẵn là exFAT.
Cách Kiểm Tra Hệ Thống Tệp Của Bạn
Nếu bạn không chắc ổ đĩa của mình sử dụng filesystem nào, hãy chạy:
df -T .
Hoặc:
findmnt -T .
Hoặc, nếu bạn chỉ muốn loại filesystem:
findmnt -n -o FSTYPE -T .
Nếu đầu ra hiển thị:
exfat
thì hành vi này là mong đợi.
Bạn có thể tìm thêm cách kiểm tra loại filesystem trong hướng dẫn sau:
Những Điểm Chính
Việc chỉ thay đổi chữ hoa thành chữ thường trông giống như một thao tác đổi tên đơn giản.
Nhưng, exFAT so sánh filename khác với hầu hết các filesystem Linux.
Hãy ghi nhớ những điểm sau:
- exFAT so sánh filename mà không xem xét kiểu chữ.
- Nó thực hiện điều này bằng cách sử dụng Up-case Table Unicode tích hợp sẵn.
Desktops,desktopsvàDESKTOPSđều được so sánh như cùng một tên.mvtin tưởng filesystem khi nó kiểm tra xem đích đã tồn tại chưa.- Kết quả là, việc đổi tên chỉ khác kiểu chữ-only thường thất bại trên exFAT.
- Đổi tên thông qua một tên tạm thời là giải pháp đơn giản và đáng tin cậy nhất.
Một khi bạn hiểu cách exFAT tra cứu filename, thông báo lỗi không còn bí ẩn nữa. Nó chỉ đơn giản là kết quả của cách filesystem được thiết kế.
Tự Thử Nghiệm Mà Không Cần Ổ exFAT (Tùy Chọn)
Phần này là tùy chọn. Bạn không cần ổ USB hoặc SSD ngoài để làm theo. Thay vào đó, bạn có thể tạo một filesystem exFAT tạm thời bên trong một tệp ảnh đĩa bằng cách sử dụng thiết bị loop của Linux.
Thiết bị loop cho phép Linux coi một file thông thường như thể nó là một thiết bị khối thực, chẳng hạn như ổ USB hoặc SSD. Điều này làm cho nó trở thành một cách an toàn để thử nghiệm mà không cần sửa đổi bất kỳ bộ nhớ vật lý nào. Khi bạn hoàn tất, chỉ cần ngắt kết nối filesystem và xóa tệp ảnh file.
Tạo Môi Trường Thử Nghiệm
Đầu tiên, cài đặt các công cụ cần thiết:
sudo apt update
sudo apt install exfatprogs
Tiếp theo, tạo một tệp ảnh đĩa 100 MiB:
truncate -s 100M exfat_test.img
Gắn tệp ảnh vào một thiết bị loop trống và lưu tên thiết bị được gán vào một biến shell:
LOOP=$(sudo losetup --find --show exfat_test.img)
Tạo một filesystem exFAT:
sudo mkfs.exfat "$LOOP"
Tạo một điểm gắn kết và gắn kết filesystem:
mkdir mnt_exfat
sudo mount -t exfat \
-o uid=$(id -u),gid=$(id -g) \
"$LOOP" mnt_exfat
Các tùy chọn gắn kết uid và gid làm cho người dùng của bạn trở thành chủ sở hữu của filesystem exFAT đã được gắn kết. Điều này cho phép bạn tạo, đổi tên và xóa file mà không cần sử dụng sudo, giúp các ví dụ trong bài uide này dễ dàng thực hiện hơn.
Kiểm Tra Các Lệnh
Chuyển đến filesystem đã được gắn kết:
cd mnt_exfat
Tạo một thư mục kiểm tra:
mkdir Desktops
Bây giờ hãy thử lệnh đã thảo luận trong bài viết này:
mv Desktops desktops
Bạn sẽ thấy hành vi tương tự như trên ổ USB hoặc SSD thực được định dạng exFAT.
Case-Only Renames Fail on exFAT.png
Dọn Dẹp
Khi bạn hoàn tất, hãy ngắt kết nối filesystem, tách thiết bị loop và xóa các file tạm thời:
cd ..
sudo umount mnt_exfat
sudo losetup -d "$LOOP"
rm exfat_test.img
rmdir mnt_exfat
Bạn Có Cần exfat-fuse?
Trên các bản phân phối Linux hiện đại, thường là không.
Nhân Linux đã bao gồm một trình điều khiển exFAT gốc từ phiên bản 5.4, và hầu hết các bản phân phối hiện tại đều sử dụng nó theo mặc định. Trong hầu hết các trường hợp, cài đặt exfatprogs là tất cả những gì bạn cần vì nó cung cấp các tiện ích như:
mkfs.exfatfsck.exfat
Các hệ thống Linux cũ hơn thường dựa vào:
exfat-fusefuse3
Các gói này cung cấp hỗ trợ exFAT trước khi nhân có trình điều khiển gốc. Chúng vẫn có sẵn trên một số bản phân phối, nhưng bạn thường không cần chúng trừ khi bạn đang làm việc với một hệ thống Linux cũ hoặc cố tình kiểm tra việc triển khai FUSE.
Câu Hỏi Thường Gặp (FAQ)
H: Tại sao mv lại nói "thư mục con của chính nó" khi tôi chỉ thay đổi kiểu chữ?
A: Bởi vì exFAT coi Desktops và desktops là cùng một tên thư mục. Khi mv kiểm tra xem đích có tồn tại không, filesystem báo cáo rằng nó có tồn tại. mv sau đó cho rằng bạn đang cố gắng di chuyển một thư mục vào chính nó và in ra thông báo lỗi tương ứng.
H: Điều này có xảy ra trên ext4, Btrfs hoặc XFS không?
A: Không, theo mặc định là không. Các filesystem này phân biệt chữ hoa chữ thường-sensitive, vì vậy Desktops và desktops được coi là các tên khác nhau. Một lần đổi tên trực tiếp thường hoạt động mà không cần bất kỳ bước bổ sung nào.
H: Điều này có ảnh hưởng đến Windows và macOS không?
A: Có. exFAT được thiết kế để không phân biệt chữ hoa chữ thường, vì vậy Windows, macOS và Linux đều so sánh filename bằng cách sử dụng cùng một quy tắc khi truy cập vào một ổ đĩa exFAT.
H: Tôi có thể làm cho exFAT phân biệt chữ hoa chữ thường-sensitive không?
A: Không. Tra cứu filename không phân biệt chữ hoa chữ thường là một phần của đặc tả filesystem exFAT. Linux không thể bật tính năng phân biệt chữ hoa chữ thường bằng một tùy chọn gắn kết hoặc cài đặt cấu hình.
H: Việc đổi tên hai bước-step có sao chép file của tôi không?
A: Không. Cả hai lệnh chỉ đơn giản là đổi tên thư mục trong cùng một filesystem. Chúng không sao chép nội dung hoặc tạo lại thư mục.
H: Việc đổi tên của tôi vẫn thất bại. Tôi nên kiểm tra điều gì?
A: Đảm bảo rằng tên tạm thời chưa tồn tại. Cũng xác nhận rằng bạn có quyền ghi đối với thư mục và cả nguồn và đích đều nằm trên cùng một filesystem exFAT.
H: Tôi có cần ổ USB exFAT để thử điều này không?
A: Không. Bạn có thể tạo một filesystem exFAT tạm thời bên trong một tệp ảnh đĩa bằng cách sử dụng thiết bị loop của Linux. Phần tùy chọn trong bài uide này chỉ cho bạn cách thiết lập, kiểm tra và xóa nó một cách an toàn.
Kết Luận
Hành vi này làm nhiều người dùng Linux ngạc nhiên vì hầu hết các filesystem Linux đều phân biệt chữ hoa chữ thường-sensitive.
Nhưng, exFAT được thiết kế chủ yếu để tương thích với Windows và bộ nhớ di động. Việc sử dụng Up-case Table Unicode đảm bảo rằng mọi hệ điều hành so sánh filename một cách nhất quán trong khi vẫn hiển thị chúng chính xác như người dùng đã tạo.
Hiểu được thiết kế này giúp giải thích không chỉ tại sao mv Desktops desktops thất bại, mà còn tại sao việc đổi tên hai bước-step luôn hoạt động.
Đọc thêm:




