Mỗi vài năm, tôi gặp vấn đề nhỏ này. Tôi thử xóa một file trong Windows Explorer, và nó ném lỗi, bảo không thể tìm thấy (và xóa) file được chỉ định. OK, chuyện xảy ra. Vì vậy tôi đi đến command line, và làm việc xóa đó. Tuy nhiên, lần này, tôi gặp một rắc rối mới. Hành động xóa thông thường không hoàn thành, với command prompt bảo: The system cannot find the file specified.
Tôi gặp vấn đề này với một lock file được tạo bởi máy in Xerox B215 của tôi trên một Samba share. Vì một lý do kỳ lạ nào đó, máy in đã cắt ngắn tên file thực tế, và thay vì nó là "Xerox_Scan.pdf", nó được đặt tên chỉ là "Xerox_Scan." Ha, nhưng nó thực sự là vậy?
Vấn đề
Vì vậy, trên command line, chúng ta có điều này:
del "Xerox_Scan."
The system cannot find the file specified.
Lúc này, tôi nhận ra tên file có thể có ký tự lạ trailing không hiển thị trong Windows Explorer hoặc command prompt. Điều này thực sự nhắc tôi đến một chiêu bài nhỏ mà tôi và một số đồng nghiệp dùng trong bài thi quản trị hệ thống cho junior. Chúng ta tạo file với ký tự đặc biệt ở cuối, như thủ thuật Alt + 255 cũ trong DOS, và xem ai tìm ra. Trong Linux, bạn có thể dùng tiện ích octal dump (od) để thấy toàn bộ tập ký tự, tất nhiên.
Giải pháp
Trong Windows, cách tiếp cận là đi với tìm kiếm tham lam (hoặc xóa để chính xác hơn). Nếu bạn thắc mắc chuyện gì xảy ra ở đây, hãy nghĩ regular expressions. Chúng ta tìm bất kỳ file (/s) nào trong bất kỳ subdirectory nào trong path chỉ định, và chúng ta tìm file có zero hoặc nhiều trailing whitespace characters. Boom. Việc xong, không còn xấu xí.
del /s \\?\D:\Scans\Xerox_Scan."
Deleted file - \\?\D:\Scans\Xerox_Scan.
Kết luận
Về mặt kỹ thuật, một file không xóa được không nên là vấn đề lớn, nhưng nó là vấn đề ở mức OCD, về mặt thẩm mỹ, và, về lý thuyết, nó có thể can thiệp vào backup script hoặc scheduled tasks nếu chúng không được thiết kế để graceful ignore file loại này. Do đó, bạn muốn làm một chút bảo trì nhẹ, dù sao.
Có nhiều phương pháp khác bạn có thể dùng. Ví dụ, Process Explorer cũng có thể tìm file và sau đó xóa chúng, bao gồm ký tự whitespace. Nhưng tôi thấy việc thực thi regex-search dòng lệnh đơn giản là giải pháp thanh lịch nhất. Dù sao, nhiệm vụ của chúng ta phiền toái nhưng có giải pháp nhanh và không đau đớn. Hẹn gặp lại.
Chúc vui.