Những ký tự nào an toàn trong tên tệp đa nền tảng cho Linux, Windows và OS-X


60

Hiện tại, tôi sử dụng YYMMDD-NAME+PAGEtên cho hầu hết các tập tin của mình. NAMEcó không gian được chuyển đổi thành dấu gạch dưới.

Tôi muốn sử dụng YYYY-MM-DDđịnh dạng ngày, nhưng tôi không chắc cách tách nó khỏi tên. A -sẽ trông lạ nếu tên bắt đầu bằng một số. Nếu tôi sử dụng a _, thì nó xung đột với dấu gạch dưới thể hiện một khoảng trắng.

Những ký tự nào an toàn hợp lý trong tên tệp sẽ hoạt động ở đây? Tôi đang dùng Linux, nhưng tôi có thể chia sẻ tệp với người khác (Windows 7, Mac OS X).


Có phải trên Unix, Windows, Amiga 1000 không?
slhck

Chủ yếu là Linux hiện đại.
Martin Uting

- biểu tượng an toàn để sử dụng trên windows 7 .. có thể là hệ điều hành hiện đại khác cũng làm như vậy .. bạn có thể sử dụng biểu tượng dấu trừ để phân tách ..
Niranjan Singh

trang web chéo có thể trùng lặp của: stackoverflow.com/questions/4814040/ từ
Ciro Santilli 心 心

Câu trả lời:


48

Tóm lược:

  • Windows: mọi thứ trừ các ký tự điều khiển của ASCII và \/:*?"<>|
  • Linux, OS-X: mọi thứ trừ null hoặc /

Trên tất cả các nền tảng, tốt nhất là tránh các ký tự không in được, chẳng hạn như các ký tự điều khiển ASCII.

các cửa sổ

Trong Windows, Windows Explorer không cho phép các ký tự điều khiển hoặc \/:*?"<>|Bạn có thể sử dụng khoảng trắng. Nếu bạn sử dụng khoảng trắng, bạn sẽ thường phải trích dẫn tên tệp khi được sử dụng từ dòng lệnh (nhưng các ứng dụng GUI không bị ảnh hưởng cho đến nay tôi biết). Hệ thống tập tin Windows như NTFS rõ ràng lưu trữ mã hóa với tên tệp, nhưng UTF-16 là tiêu chuẩn.

Một số phần của Windows phân biệt chữ hoa chữ thường, các phần khác không phân biệt chữ hoa chữ thường. Thật dễ dàng để tạo các tên tệp riêng biệt như "Ab" và "ab" trên hệ thống tệp NTFS của Windows. Các tên này đề cập đến các tệp riêng biệt có chứa nội dung riêng biệt. Tuy nhiên, mặc dù dấu nhắc lệnh của Windows sẽ liệt kê vui vẻ cả hai tệp bằng cách sử dụng dir, nhưng bạn không thể dễ dàng truy cập hoặc thao tác với một trong số chúng bằng các lệnh như type. Xem bên dưới.

Linux, OS-X

Trong Linux và OS-X, chỉ có /bộ ASCII có thể in được bị cấm. Một số ký tự (shell metachar character like *?!) sẽ gây ra sự cố trong các dòng lệnh và sẽ yêu cầu tên tệp phải được trích dẫn hoặc thoát một cách thích hợp.

Các hệ thống tập tin Linux như ext2, ext3 là bất khả tri tập hợp ký tự (tôi nghĩ rằng chúng chỉ coi nó ít nhiều như một luồng byte - chỉ null và /bị cấm). Điều này có nghĩa là bạn có thể lưu trữ tên tệp trong mã hóa UTF-8. Tôi tin rằng tùy thuộc vào trình bao hoặc ứng dụng khác để biết nên sử dụng mã hóa nào để chuyển đổi đúng tên tệp để hiển thị hoặc xử lý.

Phần kết luận

Vì vậy, bạn có thể có thể sử dụng một cách an toàn một cái gì đó như (nếu nó không quá khó để nhập)


Độ nhạy case- (in) trong Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Lưu ý rằng chúng ta không thể nhập nội dung của tệp thứ hai, typelệnh Windows chỉ trả về nội dung của Ab thay thế. Tệp thứ ba cũng khác với aB trên Linux.

(Windows 10 NTFS).


1
Tất cả trong một câu trả lời tốt, nhưng tôi không sử dụng tên tệp trong không gian. Thoát khỏi chúng đúng cách trong tất cả các bối cảnh là rắc rối hơn giá trị của nó. Lưu ý rằng Microsoft đã ngừng sử dụng khoảng trắng trong tên thư mục hệ thống. Nếu bạn cần chỉ ra ranh giới từ trong tên, CamelCase hoạt động tốt.
Isaac Rabinovitch

4
"C: \ Chương trình tệp (x86)" vẫn tồn tại trong Win8 - đó có phải là thư mục hệ thống không? Tôi đồng ý rằng không gian có thể gây ra vấn đề.
RedGrittyBrick

Nó là, nhưng nó có thể được đổi tên thành khá nhiều thứ. Tất nhiên, rất nhiều chương trình sẽ phát điên nếu bạn đổi tên thành "]: \ foobar", nhưng dù sao thì Windows cũng gọi nó là "% chương trình tệp (x86)%".
Marcks Thomas

2
Một điều cần lưu ý ở đây, hệ thống linux có thể coi chữ hoa và chữ thường là khác biệt, trong khi Windows coi chúng giống nhau.
thecoshman

1
Bạn sẽ ngạc nhiên khi có bao nhiêu chương trình hút phân tích cú pháp. Đó là lý do tại sao không có Windows 9.
Isaac Rabinovitch

46

Mặc dù câu trả lời của RedGrittyBrick là đúng về mặt kỹ thuật, an toàn không phải là vấn đề duy nhất: khả năng sử dụng cũng rất quan trọng. Tôi nghĩ một câu hỏi hay hơn là "nhân vật nào tốt để sử dụng trong tên tệp".

Một số hướng dẫn tiềm năng:

  • [0-9a-zA-Z_] - Các ký tự chữ và số và dấu gạch dưới luôn luôn tốt để sử dụng.
  • \/:*?"<>|byte null có vấn đề trên ít nhất một hệ thống và phải luôn luôn tránh.
  • Dấu cách được sử dụng làm dấu phân cách đối số trên nhiều hệ thống, vì vậy nên tránh tên tệp có khoảng trắng khi có thể. Các khoảng trắng khác (ví dụ: các tab) thậm chí còn hơn thế.
  • Dấu chấm phẩy (;) được sử dụng để phân tách các lệnh trên nhiều hệ thống. Dấu chấm phẩy và dấu phẩy (,) được sử dụng để phân tách các đối số dòng lệnh trên (một số phiên bản của?) Dòng lệnh windows.
  • []()^ #%&!@:+={}'~[`] tất cả đều có ý nghĩa đặc biệt trong nhiều vỏ, và gây khó chịu khi làm việc xung quanh, và vì vậy nên tránh. Họ cũng có xu hướng trông khủng khiếp trong các URL .
  • Nhân vật hàng đầu cần tránh:
    • Nhiều chương trình dòng lệnh sử dụng dấu gạch nối [-] để chỉ ra các đối số đặc biệt.
    • Các hệ thống dựa trên * nix sử dụng toàn bộ [.] làm ký tự hàng đầu cho các tệp và thư mục ẩn.
  • Bất cứ điều gì không có trong bộ ASCII đều có thể gây ra sự cố trên các hệ thống cũ hơn hoặc cơ bản hơn (ví dụ: một số hệ thống nhúng) và nên được sử dụng cẩn thận.

Điều đó về cơ bản để lại cho bạn:

[0-9a-zA-Z -._]

đó là luôn luôn an toàn và không gây phiền nhiễu để sử dụng (miễn là bạn bắt đầu tên tập tin với một alpha-numeric) :)


1
Các dấu ngoặc nhọn ( []) là một phần của biểu thức chính quy và cũng có ý nghĩa đặc biệt trong vỏ. Nhưng họ không tệ đến mức phải làm việc ngoại trừ một số trường hợp góc ác.
Martin Uting

1
Hrm ... tôi đoán điều tương tự có thể được nói về (), thực sự.
ness101

4
Trong zsh, các ký tự có thể được giải thích khác nhau bao gồm []()^;, vì vậy tôi nghĩ rằng câu trả lời đúng có thể thực sự là [0-9a-zA-Z.,_-]Comma cũng có thể bị loại trừ chỉ vì thấy lạ trong tên tệp, mặc dù tôi không thể nghĩ ra một trường hợp thực tế mà nó sẽ gây ra các vấn đề.
Casey Rodarmor

vâng, tôi đã xóa chúng khỏi danh sách cuối cùng
naught101

1
dấu phẩy có thể gây khó chịu, hãy thử echo whereami > a,b,ctrong cửa sổ nhắc lệnh Win10.
RedGrittyBrick

4

Bạn có thể:

  1. thay thế dấu gạch dưới hiện tại bằng #(ký hiệu hiệu đính cho không gian)
  2. gạch dưới đến ngày 'phần' từ tên tệp (hoặc dấu gạch nối thứ hai - dễ nhập hơn)

Alt-1. mũ ban đầu có thể thay thế khoảng trắng: YYMMDD-HHMM-FileName.exthoặcYYMMDD-HHMM_FileName.ext

Các ký tự tối thiểu để hiển thị rõ ràng, tự động sắp xếp với các số 0 được đệm cho tháng 1-tháng 9 (& ngày 1-9 tháng 9).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.