Có đúng không khi sử dụng một số ký tự đặc biệt khi đặt tên tệp trong Linux?


18

Là nó đúng để sử dụng một số ký tự đặc biệt, như +, &, ', .(dấu chấm) và ,(dấu phẩy), về cơ bản, trong tên tập tin.

Tôi hiểu rằng bạn có thể sử dụng -_không có vấn đề gì, nhưng thực hiện một số nghiên cứu tôi đã không thể tìm thấy điều gì đó chắc chắn về các biểu tượng khác; một số người nói rằng bạn có thể, một số người nói rằng bạn không thể, và một số người khác nói rằng "không được khuyến khích" sử dụng chúng (bất kể điều đó có nghĩa là gì).


Những chương trình bạn đang sử dụng để làm việc với các tập tin này. Chỉ các chương trình diễn giải một số ký tự theo cách đặc biệt (ví dụ: shell trên chuỗi không được trích dẫn) mới đưa ra vấn đề. Chương trình C trung bình của bạn có mọi thứ không phải là NUL mà không chớp mắt.
Anthon

9
"Chính xác" nghĩa là gì?
David Richerby

Vấn đề với việc sử dụng các ký tự đặc biệt trong tên tệp là làm như vậy sẽ làm tăng khả năng một số đoạn mã lỗi sẽ xử lý sai tên tệp. Tuy nhiên, tôi không nghĩ bất kỳ nhân vật nào bạn liệt kê có khả năng gây ra bất kỳ vấn đề nào. Bạn sẽ có nhiều vấn đề hơn với khoảng trắng, thường nên tránh . Và EOL, đặc biệt, nên tránh bằng mọi giá.

Windows có những hạn chế nghiêm ngặt hơn đối với những gì có thể có trong tên tệp, vì vậy nếu có bất kỳ cơ hội nào các tệp sẽ cần được sử dụng ở đó, đó là điều cần chú ý.
evilsoup

Câu trả lời:


28

Có đúng không khi sử dụng một số ký tự đặc biệt, như +, &, ',. (dấu chấm) và, (dấu phẩy), về cơ bản, trong tên tệp.

Vâng.

Đúng nhưng không nhất thiết phải khuyên hoặc thuận tiện.

Bạn có thể sử dụng bất kỳ ký tự nào ngoại trừ null và/ trong tên tệp trong các hệ thống tệp Unix và Linux hiện đại.

Bạn có thể sử dụng dấu câu ASCII . Một số tiện ích sử dụng điểm dừng ( dấu chấm ) và dấu phẩy trong tên của tệp mà chúng tạo.

Bạn có thể sử dụng các ký tự điều khiển ASCII , tuy nhiên điều này là không thể hiểu được vì chúng không có khả năng được hiển thị chấp nhận được và khó sử dụng.

Bạn có thể sử dụng các ký tự meta shell như ký hiệu ASCII và dấu nháy đơn ASCII. Tuy nhiên, điều này là bất tiện và đòi hỏi rằng khi xây dựng các lệnh bạn phải đặc biệt cẩn thận để trích dẫn hoặc thoát khỏi các ký tự đó.

Bạn có thể sử dụng các ký tự nhiều byte bằng cách sử dụng nhiều bảng mã. Tùy thuộc vào trình bao và / hoặc các tiện ích để diễn giải và hiển thị chính xác các ký tự không phải ASCII. Bạn nên hạn chế sử dụng mã hóa phổ biến như UTF-8 và đặt ngôn ngữ phù hợp.

Bạn sẽ có ít vấn đề nhất khi sử dụng các ký tự có thể in ASCII, giới hạn tập hợp các ký tự dấu chấm câu thành các ký tự không bao gồm các ký tự meta và không bắt đầu tên bằng dấu gạch nối (hoặc dừng - trừ khi bạn muốn ẩn tệp).


23

Như những người khác đã tuyên bố, trên các hệ thống Unix / Linux hiện đại, tên tệp có thể chứa bất kỳ ký tự nào ngoại trừ \0(NUL) và /(dấu gạch chéo).

Ngoài ra, tiêu chuẩn POSIX xác định một bộ ký tự di động cho tên tệp:

3.278 Bộ ký tự tên tệp di động

Tập hợp các ký tự mà từ đó tên tệp di động được xây dựng.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

Ba ký tự cuối cùng lần lượt là các ký tự <period>, <gạch dưới> và <hyphen>. Xem thêm Tên đường dẫn .

Các pathchktiện ích từ GNU coreutils kiểm tra cho điều này khi được gọi với các -ptùy chọn, và các -Ptùy chọn sẽ cảnh báo về tên file rỗng (mà không có giá trị nhưng có thể được thông qua như là một cuộc tranh cãi đến pathchk) và tên tập tin bắt đầu với một dấu gạch ngang ( -).


9

Đặt cược an toàn nhất là tham khảo mục nhập wikipedia cho bộ ký tự được phép cho bất kỳ hệ điều hành nào. Nó có thể được tìm thấy từ đây .

Ví dụ, đối với hầu hết các hệ thống dựa trên unix, bộ ký tự được phép là bộ 8 bit và ký tự dành riêng là ký tự null (NUL, '\0'). Tuy nhiên, không nên sử dụng các ký tự đặc biệt trong tên tệp khi chúng gây ra sự cố trong khi xóa chúng.

Ví dụ, tôi có thể có một tên tệp -ramesh.txtvà tôi cố gắng xóa nó như dưới đây.

rm -ramesh.txt
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.
rm "-ramesh.txt"
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.

Tôi cần xóa các tập tin như,

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y

Thêm chi tiết có thể được tìm thấy từ câu trả lời này là tốt .

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ý.

Vì vậy, để kết luận, vấn đề không nằm ở việc sử dụng các ký tự đặc biệt cho tên tệp mà là cách xử lý chúng.


Vì lý do đó ("cách xử lý chúng"), tôi hầu như chỉ sử dụng các chữ cái, số, dấu gạch dưới và dấu chấm, nếu chỉ để làm cho cuộc sống của tôi dễ dàng hơn khi sau này tôi quyết định tôi cần sử dụng các chương trình dòng lệnh để làm công cụ cho các tệp của mình (dường như luôn luôn xuất hiện ít nhất một lần).
phyrfox

19
Không ủng hộ tên tệp bắt đầu bằng -nhưng chính xác là: 1) bạn chắc chắn không cần các trích dẫn xung quanh tên tệp này, 2) thay vì sử dụng --đối số đặc biệt mà bạn có thể thực hiện chính xác những gì rmchính nó gợi ý: rm ./-ramesh.txtvì vậy bạn không cần phải làm điều đó chính xác như bạn đề nghị.
Michał Politowski

@ MichałPolitowski Không chỉ bạn không cần dấu ngoặc kép, chúng có hiệu lực chính xác bằng không.
ctrl-alt-delor

4

Nghiên cứu của bạn là gần như đúng. Có thể sử dụng các ký tự đặc biệt trong tên tệp, nhưng không nên vì các ký tự này có ý nghĩa đặc biệt. Các quy ước đặt tên tệp trong Linux mô tả các hạn chế khác đối với tên tệp cũng như "Tên tệp không bao giờ nên bắt đầu bằng dấu gạch nối".

Ví dụ đơn giản về thực hiện các hoạt động dòng lệnh với các ký tự đặc biệt trong tên tệp.

Như một lưu ý cá nhân, tôi muốn tránh các ký tự đặc biệt trong tên tệp vì chúng đòi hỏi sự chú ý đặc biệt khi các tệp này được sử dụng cho bất kỳ xử lý nào. Do đó, loại bỏ mối quan tâm xử lý các ký tự đặc biệt khỏi quá trình phát triển.


1
Vì vậy, lời khuyên của bạn sẽ là chỉ sử dụng -, _.(chấm) trong tên tệp?
Chris Klein

@ChrisKlein, vâng, mặc dù không phải ở phần đầu của tên tệp.
Simply_Me

Ý nghĩa đặc biệt là trong chương trình (ví dụ: shell của bạn), không phải tên tệp. Hầu như tất cả các chương trình trên U & L không quan tâm đến nhân vật ở tất cả miễn là có không phải là một NUL trong tên tập tin.
Anthon

@Anthon, vâng, vỏ của tôi như được mô tả trong liên kết.
Simply_Me

2
Như một lưu ý cá nhân, tôi khuyên các nhà phát triển đặt tên thư mục mẹ của dự án của họ một cái gì đó như "föλder \ t☃" - để họ ngay lập tức chú ý nếu họ tạo ra một lỗi phá vỡ tên tệp như vậy, thay vì xuất bản mã hoặc mã nhị phân bị hỏng mà những người khác phải làm việc xung quanh. Sử dụng nó không phải là một vấn đề, miễn là nó là thứ duy nhất bắt đầu bằng 'f', việc hoàn thành tab trong bất kỳ trình bao nào sẽ nhập vào nội dung khó nhập.
Peteris
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.