Những ký tự nào bị cấm trong tên thư mục Windows và Linux?


355

Tôi biết rằng / là bất hợp pháp trong Linux và những điều sau đây là bất hợp pháp trong Windows (tôi nghĩ) * . " / \ [ ] : ; | ,

Tôi còn thiếu gì nữa?

Tôi cần một hướng dẫn toàn diện, tuy nhiên, và một tài khoản có tính đến các ký tự hai byte. Liên kết với các nguồn lực bên ngoài là tốt với tôi.

Trước tiên tôi cần tạo một thư mục trên hệ thống tập tin bằng cách sử dụng tên có thể chứa các ký tự bị cấm, vì vậy tôi có kế hoạch thay thế các ký tự đó bằng dấu gạch dưới. Sau đó tôi cần phải viết thư mục này và nội dung của nó vào một tệp zip (sử dụng Java), vì vậy mọi lời khuyên bổ sung liên quan đến tên của các thư mục zip sẽ được đánh giá cao.


13
Một số nhân vật mà bạn đề cập trên thực tế được cho phép trên Windows. Kiểm tra điều này:echo abc > "ab.;,=[1]"
heo

3
Cũng đừng quên <và> là bất hợp pháp trên Windows.
AnotherParker

4
/ không phải là bất hợp pháp trong Linux. Bạn chỉ cần thoát nó bằng một \ khi gõ nó vào.
David C. Giám mục

5
@ DavidC.Bishop: Bài đăng SO này khẳng định rằng nhân Linux sẽ ngăn bạn làm việc với tên tệp có dấu gạch chéo. Bạn đã có thể làm cho nó hoạt động?
Soren Bjornstad

14
"/ không phải là bất hợp pháp trong Linux. Bạn chỉ cần thoát nó bằng một \ khi gõ nó vào" - tuyên bố này là hoàn toàn sai. các thành phần tên tệp không thể chứa / và thoát nó không có hiệu lực.
Jim Balter

Câu trả lời:


215

Hướng dẫn toàn diện về hướng dẫn của các nhân vật tên bị cấm sẽ không hoạt động trên Windows vì nó bảo lưu tên tệp cũng như các ký tự. Vâng, nhân vật như * " ? và những người khác bị cấm, nhưng có vô số tên chỉ gồm các ký tự hợp lệ bị cấm. Ví dụ: dấu cách và dấu chấm là ký tự tên tệp hợp lệ, nhưng tên chỉ bao gồm các ký tự đó bị cấm.

Windows không phân biệt ký tự chữ hoa và chữ thường, vì vậy bạn không thể tạo thư mục có tên Anếu tên ađã tồn tại. Tệ hơn, những cái tên dường như được cho phép như PRNCON, và nhiều cái tên khác, được bảo lưu và không được phép. Windows cũng có một số hạn chế về chiều dài; một tên tệp hợp lệ trong một thư mục có thể trở nên không hợp lệ nếu được chuyển sang thư mục khác. Các quy tắc để đặt tên tệp và thư mục là trên tài liệu Microsoft.

Nói chung, bạn không thể sử dụng văn bản do người dùng tạo để tạo tên thư mục Windows. Nếu bạn muốn cho phép người dùng để đặt tên bất cứ điều gì họ muốn, bạn phải tạo tên an toàn như A, AB, A2et al., Lưu trữ tên người dùng tạo và tương đương con đường của mình trong một tập tin dữ liệu ứng dụng, và thực hiện lập bản đồ đường dẫn trong ứng dụng của bạn.

Nếu bạn hoàn toàn phải cho phép tên thư mục do người dùng tạo, cách duy nhất để biết chúng có hợp lệ hay không là bắt ngoại lệ và giả sử tên đó không hợp lệ. Ngay cả điều đó cũng đầy nguy hiểm, vì các trường hợp ngoại lệ được ném cho truy cập bị từ chối, ổ đĩa ngoại tuyến và ngoài không gian ổ đĩa chồng lấp với những cái có thể được ném cho tên không hợp lệ. Bạn đang mở ra một lon lớn của tổn thương.


11
Cụm từ chính từ liên kết MSDN là "[và a] ny ký tự khác mà hệ thống tệp đích không cho phép". Có thể có các hệ thống tập tin khác nhau trên Windows. Một số có thể cho phép Unicode, một số khác thì không. Nói chung, cách an toàn duy nhất để xác thực tên là thử tên trên thiết bị đích.
Adrian McCarthy

72
Có một số hướng dẫn, và có một số lượng vô hạn các tên chỉ gồm các ký tự hợp lệ bị cấm không phải là xây dựng. Tương tự như vậy “Windows không phân biệt giữa chữ hoa và hạ thấp hợp cụ thể nhân vật” là một ngoại lệ ngu ngốc - OP được hỏi về cú pháp và không ngữ nghĩa, và không đúng người có đầu óc sẽ nói rằng một tên tập tin như A.txtkhông hợp lệa.TXTcó thể tồn tại.
Borodin

9
COPY CON PRNcó nghĩa là đọc từ đầu vào bàn phím hoặc stdin có thể và sao chép nó vào thiết bị máy in. Không chắc chắn rằng nó vẫn còn hiệu lực trên các cửa sổ hiện đại, nhưng chắc chắn là trong một thời gian dài. Ngày xưa, bạn có thể sử dụng nó để gõ văn bản và có một máy in ma trận điểm đơn giản là xuất nó.
AntonPiatek

6
"không mang tính xây dựng" - ngược lại, đó là sự thật. Điều không mang tính xây dựng là sự hiếu chiến của Borodin.
Jim Balter

3
"Nói chung, bạn không thể sử dụng văn bản do người dùng tạo để tạo tên thư mục Windows." <- Nếu bạn muốn làm điều này, bạn có thể có một danh sách trắng nhân vật và phần lớn nó sẽ hoạt động, nếu bạn có thể bỏ qua vấn đề đã tồn tại.
Casey

532

Trước tiên, hãy giữ cho nó đơn giản và trả lời câu hỏi.

  1. Các ký tự ASCII có thể in bị cấm là:

    • Linux / Unix:

      / (forward slash)
      
    • Các cửa sổ:

      < (less than)
      > (greater than)
      : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
      " (double quote)
      / (forward slash)
      \ (backslash)
      | (vertical bar or pipe)
      ? (question mark)
      * (asterisk)
      
  2. Ký tự không in được

    Nếu dữ liệu của bạn đến từ một nguồn cho phép các ký tự không in được thì có nhiều thứ để kiểm tra.

    • Linux / Unix:

      0 (NULL byte)
      
    • Các cửa sổ:

      0-31 (ASCII control characters)
      

    Ghi chú: Mặc dù các hệ thống tệp Linux / Unix là hợp pháp để tạo các tệp có các ký tự điều khiển trong tên tệp, nhưng nó có thể là một cơn ác mộng đối với người dùng khi xử lý các tệp đó .

  3. Tên tập tin dành riêng

    Tên tệp sau được bảo lưu:

    • Các cửa sổ:

      CON, PRN, AUX, NUL 
      COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
      LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      

      (cả trên chính chúng và với các phần mở rộng tệp tùy ý, ví dụ LPT1.txt).

  4. Các quy tắc khác

    • Các cửa sổ:

      Tên tệp không thể kết thúc trong một khoảng trắng hoặc dấu chấm.


5
Hầu hết các hệ thống tệp Windows không bị giới hạn ở các ký tự 8 bit. Có nhiều ký tự 8 bit khác (NUL, ký tự điều khiển) bị cấm trên Windows. Ngay cả khi xem xét những điều đó sẽ không cho phép người hỏi tạo ra một thư mục trên hệ thống tập tin, như anh ta đã hỏi bởi vì có vô số tên thư mục không hợp lệ được tạo thành từ các ký tự không bị cấm.
Dour High Arch

38
Những người khác đã nói rằng nó đã được và nó không mang tính xây dựng. Khi tôi đến đây để tìm câu trả lời, tôi muốn có danh sách mà tôi phải thu thập ở nơi khác: Bộ lọc nào để lọc ra khỏi đầu vào của người dùng khi tạo một nỗ lực tốt với tên tệp hợp lệ. Câu hỏi nếu các ký tự cùng trở thành không hợp lệ, cũng có thể cần một số chi tiết.
Christopher Oezbek

5
Một ký tự NULL cũng bị cấm trên Linux.
Dan Jones

3
Các dòng mới không bị cấm trên Linux. Tôi cho rằng họ nên, mặc dù ... và nếu NUL bị cấm trên Linux, thì nó bị cấm trên Windows, nó cũng hoàn thành mục đích tương tự.
Alcaro

11
@Soaku: tất nhiên, không, vì thế giới không xoay quanh Microsoft. Tại sao thêm các hạn chế không cần thiết khi chỉ có hai ký tự hoàn toàn cần thiết để cấm?
firegurafiku

67

Trong Linux và các hệ thống liên quan đến Unix khác, chỉ có hai ký tự không thể xuất hiện trong tên của tệp hoặc thư mục và đó là NUL '\0'và dấu gạch chéo '/'. Dấu gạch chéo, tất nhiên, có thể xuất hiện trong một tên đường dẫn, tách các thành phần thư mục.

Tin đồn 1 kể rằng Steven Bourne (của 'vỏ' nổi tiếng) đã có một thư mục chứa 254 tác phẩm, một cho mỗi chữ cái (mã ký tự) có thể xuất hiện trong một tên tập tin (không bao gồm /, '\0'; tên .là thư mục hiện hành, tất nhiên ). Nó được sử dụng để kiểm tra vỏ Bourne và thường xuyên rèn luyện các chương trình không mong muốn như các chương trình sao lưu.

Những người khác đã bao gồm các quy tắc Windows.

Lưu ý rằng MacOS X có hệ thống tệp không phân biệt chữ hoa chữ thường.


1 Chính Kernighan & Pike trong Thực hành lập trình đã nói nhiều như trong Chương 6, Kiểm tra, §6.5 Kiểm tra căng thẳng:

Khi Steve Bourne đang viết shell Unix của mình (được gọi là shell Bourne), anh ta đã tạo một thư mục gồm 254 tệp có tên một ký tự, một cho mỗi giá trị byte ngoại trừ '\0'và gạch chéo, hai ký tự không thể xuất hiện trong Unix tên tập tin. Ông đã sử dụng thư mục đó cho tất cả các cách kiểm tra khớp mẫu và mã thông báo. (Tất nhiên, thư mục kiểm tra được tạo bởi một chương trình.) Trong nhiều năm sau đó, thư mục đó là nguyên nhân của các chương trình đi bộ trên cây; nó đã kiểm tra chúng để phá hủy.

Lưu ý rằng thư mục phải có các mục nhập ...do đó, có thể cho rằng đó là 253 tệp (và 2 thư mục), hoặc 255 mục nhập tên, thay vì 254 tệp. Điều này không ảnh hưởng đến hiệu quả của giai thoại hoặc thử nghiệm cẩn thận mà nó mô tả.


1
254 tập tin? Còn utf8 thì sao?
j_kubik

20
Các tệp 254 là tất cả các tên tệp một ký tự, một tên cho mỗi ký tự được phép trong tên tệp. UTF-8 thậm chí không phải là một tia sáng trong mắt khi Steve Bourne viết vỏ Bourne. UTF-8 áp đặt các quy tắc về chuỗi byte hợp lệ (và không cho phép các byte 0xC0, 0xC1, 0xF5-0xFF hoàn toàn). Mặt khác, nó không khác nhiều - ở mức độ chi tiết tôi đang thảo luận.
Jonathan Leffler

1
Dấu tách thư mục trên đĩa cho các hệ thống tệp MacOS HFS + thực sự là một ':' chứ không phải là '/'. HĐH thường (có thể luôn luôn) thực hiện đúng khi bạn làm việc với API * nix. Nhưng đừng hy vọng điều này sẽ xảy ra một cách đáng tin cậy nếu bạn đang chuyển sang thế giới OSX, ví dụ như với applescript. Có vẻ như các API ca cao cũng sử dụng / và ẩn: với bạn, nhưng tôi chắc chắn rằng các API Carbon cũ không.
Dan Pritts

@DanPritts Tôi đã tạo một lược đồ phông chữ / màu tùy chỉnh trong tùy chọn của Xcode, đặt tên nó bằng /tên. Điều đó gây ra một số vấn đề, vì nó đã tạo một thư mục mới với sơ đồ.
Andreas

Lưu ý rằng nếu một thư mục có dấu hai chấm trong tên của nó, bạn không thể thêm thư mục vào PATHbiến Unix vì dấu hai chấm được sử dụng làm dấu phân cách (dấu chấm phẩy trên Windows). Vì vậy, các chương trình trong một thư mục như vậy phải được chạy với tên đường dẫn chỉ định vị trí của nó (có thể là tương đối hoặc tuyệt đối) hoặc bạn phải ở trong thư mục và có dấu chấm ( ., thư mục hiện tại) PATH, được coi là rộng rãi Một sự không an toàn.
Jonathan Leffler

36

Thay vì tạo danh sách đen các ký tự, bạn có thể sử dụng danh sách trắng . Tất cả mọi thứ được xem xét, phạm vi các ký tự có ý nghĩa trong ngữ cảnh tên tệp hoặc thư mục khá ngắn và trừ khi bạn có một số yêu cầu đặt tên rất cụ thể, người dùng của bạn sẽ không giữ nó đối với ứng dụng của bạn nếu họ không thể sử dụng toàn bộ bảng ASCII.

Nó không giải quyết vấn đề về tên được bảo lưu trong hệ thống tệp mục tiêu, nhưng với danh sách trắng, việc giảm thiểu rủi ro tại nguồn sẽ dễ dàng hơn.

Theo tinh thần đó, đây là một loạt các nhân vật có thể được coi là an toàn:

  • Chữ cái (az AZ) - Ký tự Unicode, nếu cần
  • Chữ số (0-9)
  • Gạch dưới (_)
  • Dấu gạch ngang (-)
  • Không gian
  • Chấm (.)

Và bất kỳ nhân vật an toàn bổ sung mà bạn muốn cho phép. Ngoài ra, bạn chỉ cần thực thi một số quy tắc bổ sung liên quan đến dấu cách và dấu chấm . Điều này thường là đủ:

  • Tên phải chứa ít nhất một chữ cái hoặc số (để tránh chỉ dấu chấm / dấu cách)
  • Tên phải bắt đầu bằng một chữ cái hoặc số (để tránh các dấu chấm / dấu cách hàng đầu)
  • Tên có thể không kết thúc bằng dấu chấm hoặc dấu cách (chỉ cần cắt bớt tên nếu có, giống như Explorer)

Điều này đã cho phép tên khá phức tạp và vô nghĩa. Ví dụ: những tên này sẽ có thể với các quy tắc này và là tên tệp hợp lệ trong Windows / Linux:

  • A...........ext
  • B -.- .ext

Về bản chất, ngay cả với rất ít nhân vật trong danh sách trắng, bạn vẫn nên quyết định điều gì thực sự có ý nghĩa và xác thực / điều chỉnh tên cho phù hợp. Trong một trong các ứng dụng của mình, tôi đã sử dụng các quy tắc tương tự như trên nhưng tước bỏ mọi dấu chấm và dấu cách trùng lặp.


15
Và những người dùng không nói tiếng Anh của tôi, những người sẽ bị làm phiền bởi điều này thì sao?
pkh

2
@pkh: Như tôi đã đề cập trong bài viết của mình, bạn sẽ bao gồm bất kỳ ký tự unicode cần thiết nào trong danh sách trắng của bạn. Phạm vi các ký tự thường có thể được chỉ định khá dễ dàng, đặc biệt nếu bạn sử dụng các biểu thức thông thường chẳng hạn.
AeonOfTime

2
Chúng tôi sử dụng cách tiếp cận danh sách trắng, nhưng đừng quên trên Windows, bạn phải quản lý các chuỗi độc lập, không phụ thuộc vào trường hợp, như tên thiết bị (prn, lpt1, con) và. và ..
tahoar

2
Bạn đã bỏ lỡ hạn chế của Windows: không được kết thúc bằng dấu chấm hoặc dấu cách.
Martin Bonner hỗ trợ Monica

1
"Tất cả những điều được xem xét, phạm vi các ký tự có ý nghĩa trong bối cảnh tên tệp hoặc thư mục là khá ngắn." Có thể cho một số trường hợp sử dụng. Tôi hiện đang làm việc trên một dự án liên quan đến các tệp phương tiện bằng 20 ngôn ngữ và tên tệp cần phản ánh tiêu đề của mục phương tiện vì người dùng cuối sẽ tìm thấy nội dung theo cách đó. Nhiều tên sử dụng dấu câu. Bất kỳ hạn chế nào đối với các ký tự tên tệp đều có giá, vì vậy trong trường hợp này, chúng tôi phải giảm thiểu các hạn chế. Trong trường hợp sử dụng này, phạm vi các ký tự không có ý nghĩa trong tên tệp ngắn hơn và đơn giản hơn nhiều so với các ký tự đó.
LarsH

29

Cách dễ dàng để Windows cho bạn biết câu trả lời là cố gắng đổi tên tệp qua Explorer và nhập / cho tên mới. Windows sẽ bật lên một hộp thông báo cho bạn biết danh sách các ký tự bất hợp pháp.

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

https://support.microsoft.com/en-us/kb/177506


28

Chà, nếu chỉ cho mục đích nghiên cứu, thì cách tốt nhất của bạn là xem mục Wikipedia này trên Filenames .

Nếu bạn muốn viết một hàm di động để xác thực đầu vào của người dùng và tạo tên tệp dựa trên đó, câu trả lời ngắn là không . Hãy xem một mô-đun di động như File của Perl :: Spec để có cái nhìn thoáng qua về tất cả các bước nhảy cần thiết để thực hiện một nhiệm vụ "đơn giản" như vậy.


5

Đối với Windows, bạn có thể kiểm tra nó bằng PowerShell

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

Để hiển thị mã UTF-8, bạn có thể chuyển đổi

$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference

Đối với những người không nói được PowershelI, $ FileNameInvalidChars là 0x00 đến 0x1F và: "<> | *? \ /
Robin Davies

4

Trong Windows 10 (2019), các ký tự sau bị cấm do lỗi khi bạn cố gắng nhập chúng:

Tên tệp không thể chứa bất kỳ ký tự nào sau đây:

\ / : * ? " < > |


3

Đây là cách thực hiện ac # cho các cửa sổ dựa trên câu trả lời của Christopher Oezbek

Nó được làm cho phức tạp hơn bởi boolean chứaFolder, nhưng hy vọng bao gồm mọi thứ

/// <summary>
/// This will replace invalid chars with underscores, there are also some reserved words that it adds underscore to
/// </summary>
/// <remarks>
/// /programming/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
/// </remarks>
/// <param name="containsFolder">Pass in true if filename represents a folder\file (passing true will allow slash)</param>
public static string EscapeFilename_Windows(string filename, bool containsFolder = false)
{
    StringBuilder builder = new StringBuilder(filename.Length + 12);

    int index = 0;

    // Allow colon if it's part of the drive letter
    if (containsFolder)
    {
        Match match = Regex.Match(filename, @"^\s*[A-Z]:\\", RegexOptions.IgnoreCase);
        if (match.Success)
        {
            builder.Append(match.Value);
            index = match.Length;
        }
    }

    // Character substitutions
    for (int cntr = index; cntr < filename.Length; cntr++)
    {
        char c = filename[cntr];

        switch (c)
        {
            case '\u0000':
            case '\u0001':
            case '\u0002':
            case '\u0003':
            case '\u0004':
            case '\u0005':
            case '\u0006':
            case '\u0007':
            case '\u0008':
            case '\u0009':
            case '\u000A':
            case '\u000B':
            case '\u000C':
            case '\u000D':
            case '\u000E':
            case '\u000F':
            case '\u0010':
            case '\u0011':
            case '\u0012':
            case '\u0013':
            case '\u0014':
            case '\u0015':
            case '\u0016':
            case '\u0017':
            case '\u0018':
            case '\u0019':
            case '\u001A':
            case '\u001B':
            case '\u001C':
            case '\u001D':
            case '\u001E':
            case '\u001F':

            case '<':
            case '>':
            case ':':
            case '"':
            case '/':
            case '|':
            case '?':
            case '*':
                builder.Append('_');
                break;

            case '\\':
                builder.Append(containsFolder ? c : '_');
                break;

            default:
                builder.Append(c);
                break;
        }
    }

    string built = builder.ToString();

    if (built == "")
    {
        return "_";
    }

    if (built.EndsWith(" ") || built.EndsWith("."))
    {
        built = built.Substring(0, built.Length - 1) + "_";
    }

    // These are reserved names, in either the folder or file name, but they are fine if following a dot
    // CON, PRN, AUX, NUL, COM0 .. COM9, LPT0 .. LPT9
    builder = new StringBuilder(built.Length + 12);
    index = 0;
    foreach (Match match in Regex.Matches(built, @"(^|\\)\s*(?<bad>CON|PRN|AUX|NUL|COM\d|LPT\d)\s*(\.|\\|$)", RegexOptions.IgnoreCase))
    {
        Group group = match.Groups["bad"];
        if (group.Index > index)
        {
            builder.Append(built.Substring(index, match.Index - index + 1));
        }

        builder.Append(group.Value);
        builder.Append("_");        // putting an underscore after this keyword is enough to make it acceptable

        index = group.Index + group.Length;
    }

    if (index == 0)
    {
        return built;
    }

    if (index < built.Length - 1)
    {
        builder.Append(built.Substring(index));
    }

    return builder.ToString();
}

Tôi có ba câu hỏi: 1. Tại sao bạn khởi tạo StringBuildervới giá trị dung lượng ban đầu? 2. Tại sao bạn thêm 12 vào chiều dài filename? 3. 12 người được chọn tùy ý hay có một số suy nghĩ đằng sau con số này?
iiminov

2

Kể từ ngày 18/08/2016, không có danh sách các ký tự và tên tệp đen hoặc trắng đơn giản nào trong số các câu trả lời cho chủ đề này - và có rất nhiều câu trả lời.

Gợi ý tốt nhất tôi có thể đưa ra là cho phép người dùng đặt tên cho tệp theo cách anh ta thích. Sử dụng trình xử lý lỗi khi ứng dụng cố lưu tệp, bắt bất kỳ trường hợp ngoại lệ nào, giả sử tên tệp là lỗi (rõ ràng sau khi đảm bảo đường dẫn lưu cũng ổn) và nhắc người dùng nhập tên tệp mới. Để có kết quả tốt nhất, hãy đặt quy trình kiểm tra này trong một vòng lặp tiếp tục cho đến khi người dùng hiểu đúng hoặc bỏ cuộc. Làm việc tốt nhất cho tôi (ít nhất là trong VBA).


1
Câu trả lời của bạn @FCastro là chính xác từ quan điểm kỹ thuật. Tuy nhiên, từ góc độ UX, đó là một cơn ác mộng - người dùng buộc phải chơi trò chơi "gõ một cái gì đó và tôi sẽ nói với bạn nếu bạn thành công" hết lần này đến lần khác. Tôi muốn thấy một thông báo (kiểu cảnh báo) nói với người dùng rằng họ đã nhập một ký tự bất hợp pháp mà sau này sẽ được chuyển đổi.
Mike

Christopher Oezbek cung cấp một danh sách đen như vậy vào năm 2015.
Jim Balter

1

Mặc dù các ký tự Unix bất hợp pháp duy nhất có thể là /NULL, mặc dù cần xem xét một số cách giải thích dòng lệnh.

Ví dụ, mặc dù có thể hợp pháp khi đặt tên tệp 1>&2hoặc 2>&1trong Unix, các tên tệp như thế này có thể bị hiểu sai khi được sử dụng trên một dòng lệnh.

Tương tự như vậy có thể đặt tên một tệp $PATH, nhưng khi cố gắng truy cập nó từ dòng lệnh, shell sẽ chuyển $PATHthành giá trị biến của nó.


cho literals trong BASH, cách tốt nhất mà tôi đã tìm thấy tuyên bố literals mà không suy là $'myvalueis', ví dụ: $ echo 'hi' > $'2>&1', cat 2\>\&1"hi"
ThorSummoner

1

Khó khăn với quy định, những gì là hợp pháp và không được đã adressed và danh sách cho phép được đề nghị . Nhưng Windows hỗ trợ các ký tự nhiều hơn 8 bit . Wikipedia nói rằng (ví dụ)

dấu hai chấm ký tự sửa đổi [( Xem 7. bên dưới ) đôi khi được sử dụng trong tên tệp Windows vì nó giống hệt dấu hai chấm trong phông chữ Segoe UI được sử dụng cho tên tệp. Bản thân dấu hai chấm [thừa kế ASCII] không được phép.

Do đó, tôi muốn trình bày một cách tiếp cận tự do hơn nhiều bằng cách sử dụng các ký tự Unicode để thay thế các cách tiếp cận "bất hợp pháp". Tôi tìm thấy kết quả trong trường hợp sử dụng tương đương của tôi bằng cách dễ đọc hơn nhiều. Hãy tìm ví dụ vào khối này . Thêm vào đó bạn thậm chí có thể khôi phục nội dung ban đầu từ đó. Các lựa chọn và nghiên cứu có thể được cung cấp trong danh sách sau đây:

  1. Thay vì *( U+002A * ASTERISK), bạn có thể sử dụng một trong nhiều danh sách được liệt kê, ví dụ U+2217 ∗ (ASTERISK OPERATOR)hoặcFull Width Asterisk U+FF0A *
  2. Thay vì ., bạn có thể sử dụng một trong số này , ví dụ⋅ U+22C5 dot operator
  3. Thay vì ", bạn có thể sử dụng “ U+201C english leftdoublequotemark(Giải pháp thay thế xem tại đây )
  4. Thay vì /( / SOLIDUS U+002F), bạn có thể sử dụng ∕ DIVISION SLASH U+2215(những người khác ở đây )
  5. Thay vì \( \ U+005C Reverse solidus), bạn có thể sử dụng ⧵ U+29F5 Reverse solidus operator( thêm )
  6. Thay vì [( U+005B Left square bracket) và ]( U+005D Right square bracket), bạn có thể sử dụng ví dụ U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET(từ đây , nhiều khả năng hơn ở đây )
  7. Thay vì :, bạn có thể sử dụng U+2236 ∶ RATIO (for mathematical usage)hoặc U+A789 ꞉ MODIFIER LETTER COLON, (xem dấu hai chấm (chữ cái) , đôi khi được sử dụng trong tên tệp Windows vì nó giống hệt dấu hai chấm trong phông chữ Segoe UI được sử dụng cho tên tệp. Bản thân dấu hai chấm không được phép) (Xem tại đây )
  8. Thay vì ;, bạn có thể sử dụng U+037E ; GREEK QUESTION MARK(xem tại đây )
  9. Đối với |, có một số sản phẩm thay thế tốt như: U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDEShoặc U+01C0 ǀ LATIN LETTER DENTAL CLICK( Wikipedia ). Ngoài ra các nhân vật vẽ hộp chứa các tùy chọn khác nhau.
  10. Thay vì ,( , U+002C COMMA), bạn có thể sử dụng ví dụ ‚ U+201A SINGLE LOW-9 QUOTATION MARK(xem tại đây )
  11. Đối với ?( U+003F ? QUESTION MARK), đây là những ứng cử viên tốt: U+FF1F ? FULLWIDTH QUESTION MARKhoặc U+FE56 ﹖ SMALL QUESTION MARK(từ ông lại , thêm hai từ dingbats Khối , tìm kiếm cho "câu hỏi")

0

Khi tạo các phím tắt internet trong Windows, để tạo tên tệp, nó bỏ qua các ký tự không hợp lệ, ngoại trừ dấu gạch chéo về phía trước, được chuyển thành dấu trừ.


3
"Không phải là một câu trả lời ... đã từ chối - một người điều hành đã xem xét cờ của bạn, nhưng không tìm thấy bằng chứng nào hỗ trợ nó". Bạn trêu tôi. Người điều hành tốt hơn, xin vui lòng.
Jim Balter

-1

Trong shell Unix, bạn có thể trích dẫn hầu hết mọi ký tự trong dấu ngoặc đơn '. Ngoại trừ chính trích dẫn và bạn không thể thể hiện các ký tự điều khiển, vì \không được mở rộng. Có thể truy cập vào một trích dẫn từ bên trong một chuỗi trích dẫn, bởi vì bạn có thể nối các chuỗi với các trích dẫn đơn và kép, giống như 'I'"'"'m'có thể được sử dụng để truy cập vào một tệp có tên "I'm"(cũng có thể trích dẫn kép ở đây).

Vì vậy, bạn nên tránh tất cả các ký tự điều khiển, vì chúng quá khó để nhập vào trình bao. Phần còn lại vẫn rất buồn cười, đặc biệt là các tệp bắt đầu bằng dấu gạch ngang, bởi vì hầu hết các lệnh đều đọc các tùy chọn đó trừ khi bạn có hai dấu gạch ngang --trước đó hoặc bạn chỉ định chúng với ./, cũng ẩn dấu bắt đầu -.

Nếu bạn muốn đẹp, đừng sử dụng bất kỳ ký tự nào mà shell và các lệnh thông thường sử dụng làm phần tử cú pháp, đôi khi phụ thuộc vào vị trí, ví dụ: bạn vẫn có thể sử dụng -, nhưng không phải là ký tự đầu tiên; tương tự ., bạn chỉ có thể sử dụng nó làm ký tự đầu tiên khi bạn muốn nói ("tệp ẩn"). Khi bạn có ý nghĩa, tên tệp của bạn là chuỗi thoát VT100 ;-), để ls cắt xén đầu ra.


Câu hỏi không phải là về vỏ ốc.
Jim Balter

-8

Tôi có cùng nhu cầu và đang tìm kiếm đề xuất hoặc tài liệu tham khảo tiêu chuẩn và đã xem qua chủ đề này. Danh sách đen các ký tự hiện tại của tôi cần tránh trong tên tệp và thư mục là:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};

4
bạn có muốn bình luận về việc có @trong danh sách?
PypeBros

8
Câu hỏi là nhân vật nào là bất hợp pháp. Hầu hết các nhân vật trong danh sách của bạn là hợp pháp.
Nigel Alderton

6
bức thư b? lol, tôi giả sử đó là b từ lank spaces... cũng vẫn để lại một vài ... Tôi đổi tên một bức tranh (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpgnhưng đã phải thay đổi nó trở lại bởi vì nó trông tức giận ...
ashleedawg
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.