Jakie znaki są zabronione w nazwach katalogów Windows i Linux?

355

Wiem, że / jest nielegalne w systemie Linux, a następujące są nielegalne w systemie Windows (myślę) * . " / \ [ ] : ; | ,

Czego jeszcze mi brakuje?

Potrzebuję jednak kompleksowego przewodnika uwzględniającego znaki dwubajtowe. Łączenie się z zewnętrznymi zasobami jest dla mnie w porządku.

Najpierw muszę utworzyć katalog w systemie plików, używając nazwy, która może zawierać niedozwolone znaki, więc planuję zastąpić te znaki podkreśleniami. Następnie muszę napisać ten katalog i jego zawartość do pliku zip (przy użyciu Java), więc wszelkie dodatkowe porady dotyczące nazw katalogów zip będą mile widziane.

Jeff
źródło
13
Niektóre z wymienionych przez ciebie postaci są w rzeczywistości dozwolone w systemie Windows. Sprawdź to:echo abc > "ab.;,=[1]"
dolmen
3
Nie zapominaj również, że <i> są nielegalne w systemie Windows.
AnotherParker
4
/ nie jest nielegalny w systemie Linux. Musisz tylko uciec od \ podczas wpisywania.
David C. Bishop
5
@ DavidC.Bishop: Ten post SO stwierdza, że ​​jądro Linuksa uniemożliwi pracę z nazwą pliku zawierającą ukośnik. Czy udało ci się sprawić, by działało?
Soren Bjornstad,
14
„/ nie jest nielegalne w Linuksie. Musisz tylko uciec z \ podczas wpisywania go” - to stwierdzenie jest całkowicie błędne. komponenty nazw plików nie mogą zawierać /, a ich ucieczka nie ma żadnego efektu.
Jim Balter

Odpowiedzi:

215

„Kompleksowy przewodnik” dotyczący zabronionych znaków nazw plików nie będzie działał w systemie Windows, ponieważ rezerwuje nazwy plików i znaki. Tak, znaki takie jak * " ?i inne są zabronione, ale istnieje nieskończona liczba nazw złożonych tylko z prawidłowych znaków, które są zabronione. Na przykład spacje i kropki są poprawnymi znakami nazw plików, ale nazwy złożone tylko z tych znaków są zabronione.

System Windows nie rozróżnia wielkich i małych liter, więc nie można utworzyć folderu o nazwie, Ajeśli taki ajuż istnieje. Gorsze, pozornie dozwolony nazwy jak PRNi CON, i wiele innych, są zastrzeżone i nie wolno. System Windows ma również kilka ograniczeń długości; nazwa pliku ważna w jednym folderze może stać się niepoprawna, jeśli zostanie przeniesiona do innego folderu. Reguły nazewnictwa plików i folderów znajdują się w dokumentach Microsoft.

Zasadniczo nie można używać tekstu generowanego przez użytkownika do tworzenia nazw katalogów Windows. Jeśli chcesz, aby umożliwić użytkownikom nazwa cokolwiek chcą, trzeba stworzyć bezpieczne nazwiska jak A, AB, A2et al., Nazwy przechowywać generowane przez użytkownika i ich ekwiwalenty ścieżka w pliku danych aplikacji i wykonać mapowanie ścieżki w aplikacji.

Jeśli absolutnie musisz zezwolić na nazwy folderów generowane przez użytkowników, jedynym sposobem na stwierdzenie, czy są one nieprawidłowe, jest wychwycenie wyjątków i założenie, że nazwa jest nieprawidłowa. Nawet to jest obarczone niebezpieczeństwem, ponieważ wyjątki zgłaszane w przypadku odmowy dostępu, dyski offline i brak miejsca na dysku pokrywają się z wyjątkami, które można wyrzucić w przypadku nieprawidłowych nazw. Otwierasz jedną wielką paczkę krzywdy.

Dour High Arch
źródło
11
Fraza kluczowa z łącza MSDN to „[i] każdy inny znak, na który nie zezwala docelowy system plików”. W systemie Windows mogą występować różne systemy plików. Niektóre mogą zezwalać na Unicode, inne nie. Zasadniczo jedynym bezpiecznym sposobem sprawdzenia poprawności nazwy jest wypróbowanie jej na urządzeniu docelowym.
Adrian McCarthy
72
Istnieją pewne wytyczne, a „istnieje nieskończona liczba nazw złożonych tylko z prawidłowych znaków, które są zabronione”, nie jest konstruktywna. Podobnie „system Windows nie rozróżnia wielkich i małych liter” to głupi wyjątek - OP pyta o składnię, a nie semantykę, a żaden prawy człowiek nie powiedziałby, że nazwa pliku A.txtjest nieprawidłowa, ponieważ a.TXTmoże istnieć.
Borodin
9
COPY CON PRNoznacza odczyt z wejścia klawiatury lub możliwy standard i skopiowanie go na drukarkę. Nie jestem pewien, czy nadal obowiązuje w nowoczesnych oknach, ale na pewno było to przez długi czas. W dawnych czasach można było go używać do pisania tekstu, a drukarka mozaikowa po prostu go drukowała.
AntonPiatek,
6
„nie jest konstruktywny” - wręcz przeciwnie, jest faktem. To, co nie jest konstruktywne, to wojowniczość Borodina.
Jim Balter
3
„Zasadniczo nie można używać tekstu generowanego przez użytkownika do tworzenia nazw katalogów Windows”. <- Jeśli chcesz to zrobić, możesz po prostu mieć białą listę postaci i będzie ona w dużej mierze działać, jeśli zignorujesz problem, który już istnieje.
Casey
532

Uprośćmy to i najpierw odpowiedzmy na pytanie.

  1. Niedozwolonymi drukowanymi znakami ASCII są:

    • Linux / Unix:

      / (forward slash)
      
    • Windows:

      < (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. Znaki niedrukowalne

    Jeśli Twoje dane pochodzą ze źródła, które zezwala na znaki niedrukowalne, jest więcej do sprawdzenia.

    • Linux / Unix:

      0 (NULL byte)
      
    • Windows:

      0-31 (ASCII control characters)
      

    Uwaga: Chociaż w systemach plików Linux / Unix dozwolone jest tworzenie plików ze znakami kontrolnymi w nazwie pliku, użytkownicy mogą mieć koszmar z takimi plikami .

  3. Zarezerwowane nazwy plików

    Zastrzeżone są następujące nazwy plików:

    • Windows:

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

      (zarówno samodzielnie, jak i z dowolnymi rozszerzeniami plików, np LPT1.txt.).

  4. Inne zasady

    • Windows:

      Nazwy plików nie mogą kończyć się spacją ani kropką.

Christopher Oezbek
źródło
5
Większość systemów plików Windows nie jest ograniczona do znaków 8-bitowych. Istnieje wiele innych 8-bitowych znaków (NUL, znaki kontrolne), które są zabronione w systemie Windows. Nawet biorąc pod uwagę, nie pozwoli to pytającemu „stworzyć katalogu w systemie plików”, o co prosił, ponieważ istnieje nieskończona liczba niepoprawnych nazw katalogów złożonych z niedozwolonych znaków.
Dour High Arch
38
Inni już to powiedzieli i nie jest to konstruktywne. Gdy przyszedłem tutaj, szukając odpowiedzi, chciałem listę, którą musiałem zebrać gdzie indziej: Które znaki należy odfiltrować z danych wprowadzanych przez użytkownika podczas tworzenia dobrej próby prawidłowej nazwy pliku. Pytanie, czy postacie razem stają się nieważne, również może wymagać pewnego dopracowania.
Christopher Oezbek
5
Znak NULL jest również zabroniony w systemie Linux.
Dan Jones
3
Newlines nie są blokowane w systemie Linux. Twierdziłbym, że tak powinno być ... a jeśli NUL zostanie zbanowany w Linuksie, to zostanie zbanowany w Windowsie, wypełni ten sam cel.
Alcaro,
11
@ Soaku: oczywiście nie, ponieważ świat nie kręci się wokół Microsoftu. Po co dodawać niepotrzebne ograniczenia, skoro tylko dwie postacie są absolutnie niezbędne, aby zabronić?
firegurafiku 18.04.17
67

W Linuksie i innych systemach związanych z Uniksem istnieją tylko dwa znaki, które nie mogą pojawić się w nazwie pliku lub katalogu, a są to NUL '\0'i ukośnik '/'. Ukośnik może oczywiście występować w nazwie ścieżki, oddzielając składniki katalogu.

Plotka 1 głosi, że Steven Bourne (z „shell” FAME) miał katalog zawierający 254 plików, po jednym dla każdej litery (kod znaków), które mogą pojawić się w nazwie pliku (z wyłączeniem /, '\0'; nazwa .był obecny katalog, oczywiście ). Służył do testowania powłoki Bourne'a i rutynowo dokonywał spustoszenia w nieostrożnych programach, takich jak programy do tworzenia kopii zapasowych.

Inne osoby przestrzegały zasad systemu Windows.

Pamiętaj, że MacOS X ma system plików bez rozróżniania wielkości liter.


1 To Kernighan i Pike w praktyce programowania powiedział tyle samo w rozdziale 6, Testowanie, §6.5 Testy warunków skrajnych:

Kiedy Steve Bourne pisał swoją powłokę uniksową (która stała się znana jako powłoka Bourne'a), stworzył katalog 254 plików o nazwach jednoznakowych, po jednym dla każdej wartości bajtu oprócz '\0'i ukośnika, dwóch znaków, które nie mogą występować w Uniksie nazwy plików. Używał tego katalogu do wszelkiego rodzaju testów dopasowania wzorców i tokenizacji. (Katalog testowy został oczywiście utworzony przez program). Przez lata katalog ten był zmorą programów do chodzenia po plikach; wystawił ich na próbę zniszczenia.

Należy pamiętać, że katalog musi być zawarta wpisy .i ..tak było wzięte stanowią 253 pliki (katalogi i 2) lub 255 wpisów nazw, zamiast 254 plików. Nie wpływa to na skuteczność anegdoty ani na dokładne testowanie, które opisuje.

Jonathan Leffler
źródło
1
254 plików? A co z utf8?
j_kubik
20
Wszystkie 254 pliki to jednoznakowe nazwy plików, po jednym na znak dozwolony w nazwie pliku. UTF-8 nie był nawet błyskiem w oku, gdy Steve Bourne napisał powłokę Bourne'a. UTF-8 narzuca reguły dotyczące prawidłowych sekwencji bajtów (i całkowicie wyklucza bajty 0xC0, 0xC1, 0xF5-0xFF). W przeciwnym razie nie różni się zbytnio - na poziomie szczegółowości, o którym mówię.
Jonathan Leffler,
1
Separator katalogów na dysku dla systemów plików MacOS HFS + to tak naprawdę „:”, a nie „/”. System operacyjny zwykle (prawdopodobnie zawsze) robi dobrze, gdy pracujesz z interfejsami API * nix. Ale nie oczekuj, że stanie się to niezawodnie, jeśli przeprowadzasz się do świata OSX, np. Z AppleScript. Wygląda na to, że interfejsy API Cocoa używają / i ukrywają również: przed tobą, ale jestem pewien, że stare API Carbon nie.
Dan Pritts,
@ DanPritts Stworzyłem niestandardową czcionkę / schemat kolorów w preferencjach Xcode, nadając mu /nazwę w nazwie. To spowodowało pewne problemy, ponieważ utworzył nowy katalog ze schematem w.
Andreas
Zauważ, że jeśli katalog ma dwukropek w nazwie, nie można dodać katalogu do PATHzmiennej Unix , ponieważ dwukropek jest używany jako separator (średnik w systemie Windows). Tak więc programy w takim katalogu muszą być albo uruchamiane ze ścieżką, która określa, gdzie to jest (może być względne lub bezwzględne), albo musisz znajdować się w tym katalogu i mieć kropkę ( .bieżący katalog) PATH, która jest powszechnie uważana za niebezpieczne.
Jonathan Leffler
36

Zamiast tworzyć czarną listę znaków, możesz użyć białej listy . Biorąc wszystko pod uwagę, zakres znaków, które mają sens w kontekście nazwy pliku lub katalogu, jest dość krótki i chyba że masz jakieś bardzo specyficzne wymagania dotyczące nazewnictwa, twoi użytkownicy nie zniosą go przeciwko twojej aplikacji, jeśli nie będą mogli użyć całej tabeli ASCII.

Nie rozwiązuje to problemu zarezerwowanych nazw w docelowym systemie plików, ale dzięki białej liście łatwiej jest zmniejszyć ryzyko u źródła.

W tym duchu jest to szereg znaków, które można uznać za bezpieczne:

  • Litery (az AZ) - w razie potrzeby także znaki Unicode
  • Cyfry (0–9)
  • Podkreślenie (_)
  • Łącznik (-)
  • Przestrzeń
  • Kropka (.)

I wszelkie dodatkowe bezpieczne postacie, na które chcesz zezwolić. Poza tym musisz egzekwować dodatkowe zasady dotyczące spacji i kropek . Zazwyczaj wystarcza to:

  • Nazwa musi zawierać co najmniej jedną literę lub cyfrę (aby uniknąć tylko kropek / spacji)
  • Nazwa musi zaczynać się od litery lub cyfry (aby uniknąć wiodących kropek / spacji)
  • Nazwa nie może kończyć się kropką ani spacją (po prostu przytnij je, jeśli są obecne, tak jak Explorer)

To już pozwala na dość złożone i bezsensowne nazwy. Na przykład te nazwy byłyby możliwe przy tych regułach i byłyby prawidłowymi nazwami plików w systemie Windows / Linux:

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

W istocie, nawet przy tak małej liczbie znaków na białej liście, powinieneś nadal decydować, co naprawdę ma sens, i odpowiednio zweryfikować / dostosować nazwę. W jednej z moich aplikacji użyłem tych samych reguł, co powyżej, ale usunąłem wszelkie zduplikowane kropki i spacje.

AeonOfTime
źródło
15
A co z moimi nieanglojęzycznymi użytkownikami, których wszyscy by to popsuły?
pkh
2
@pkh: Jak wspomniałem w moim poście, na białej liście umieścisz wszystkie potrzebne znaki Unicode. Zakresy znaków można zwykle dość łatwo określić, szczególnie jeśli używasz na przykład wyrażeń regularnych.
AeonOfTime,
2
Stosujemy podejście z białej listy, ale nie zapominaj, że w systemie Windows musisz zarządzać zastrzeżonymi, niezależnymi od wielkości liter ciągami, takimi jak nazwy urządzeń (prn, lpt1, con) i. i ..
tahoar
2
Pominięto ograniczenie systemu Windows: nie może kończyć się kropką ani spacją.
Martin Bonner wspiera Monikę
1
„Biorąc pod uwagę wszystko, zakres znaków, które mają sens w kontekście nazwy pliku lub katalogu, jest dość krótki.” Może w niektórych przypadkach użycia. Pracuję nad projektem obejmującym teraz pliki multimedialne w 20 językach, a nazwy plików muszą odzwierciedlać tytuł elementu multimedialnego, ponieważ użytkownicy końcowi znajdą w ten sposób treść. Wiele nazw używa interpunkcji. Wszelkie ograniczenia znaków w nazwach plików wiążą się z pewną ceną, dlatego w tym przypadku musimy zminimalizować ograniczenia. W tym przypadku zakres znaków, które nie mają sensu w nazwie pliku, jest o wiele krótszy i prostszy niż tych, które mają znaczenie.
LarsH
29

Najłatwiejszym sposobem, aby system Windows poinformował cię o odpowiedzi, jest próba zmiany nazwy pliku za pomocą Eksploratora i wpisanie / dla nowej nazwy. Windows wyświetli okno komunikatu z listą niedozwolonych znaków.

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

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

chrisjej
źródło
28

Cóż, jeśli tylko w celach badawczych, najlepszym rozwiązaniem jest przejrzenie tego wpisu w Wikipedii na temat nazw plików .

Jeśli chcesz napisać funkcję przenośną do sprawdzania poprawności danych wejściowych użytkownika i tworzenia na podstawie tych nazw plików, krótka odpowiedź brzmi „ nie” . Rzuć okiem na przenośny moduł, taki jak Perl's File :: Spec, aby rzucić okiem na wszystkie przeskoki potrzebne do wykonania tak „prostego” zadania.

Leonardo Herrera
źródło
5

W systemie Windows można to sprawdzić za pomocą programu PowerShell

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

Aby wyświetlić kody UTF-8, możesz je przekonwertować

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

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

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
Wojciech Sciesiński
źródło
Dla tych, którzy nie mówią PowershelI, $ FileNameInvalidChars wynosi od 0x00 do 0x1F i: "<> | *? \ /
Robin Davies
4

W systemie Windows 10 (2019) następujące znaki są zabronione przez błąd podczas próby ich wpisania:

Nazwa pliku nie może zawierać żadnego z następujących znaków:

\ / : * ? " < > |

Bret Cameron
źródło
3

Oto implementacja ac # dla okien oparta na odpowiedzi Christophera Oezbka

Zostało to bardziej skomplikowane przez wartość logiczną zawieraFolder, ale mam nadzieję, że obejmuje wszystko

/// <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();
}
Charlie Rix
źródło
Mam trzy pytania: 1. Dlaczego zainicjowałeś StringBuilderpoczątkową wartość pojemności? 2. Dlaczego dodałeś 12 do długości filename? 3. Czy 12 zostało wybranych arbitralnie, czy też kryje się za tym numer?
iiminov
2

Według stanu na 18.04.2017 wśród odpowiedzi na ten temat nie ma prostej czarnej lub białej listy znaków i nazw plików - i jest wiele odpowiedzi.

Najlepszą propozycją, jaką mogłem wymyślić, było zezwolenie użytkownikowi na nazwanie pliku w dowolny sposób. Korzystając z procedury obsługi błędów, gdy aplikacja próbuje zapisać plik, wychwyć wszelkie wyjątki, załóż, że nazwa jest winna (oczywiście po upewnieniu się, że ścieżka zapisywania również była poprawna) i poproś użytkownika o podanie nowej nazwy pliku. Aby uzyskać najlepsze wyniki, umieść tę procedurę sprawdzania w pętli, która będzie kontynuowana, dopóki użytkownik nie zrobi tego poprawnie lub zrezygnuje. Działa najlepiej dla mnie (przynajmniej w VBA).

FCastro
źródło
1
Twoja odpowiedź @FCastro jest prawidłowa z technicznego punktu widzenia. Jednak z perspektywy UX jest to koszmar - użytkownik jest zmuszony grać w grę „wpisz coś, a powiem ci, jeśli ci się uda”. Wolę zobaczyć komunikat (styl ostrzeżenia) informujący użytkownika, że ​​wprowadził on niedozwolony znak, który później zostanie przekonwertowany.
Mike
Christopher Oezbek dostarczył taką czarną listę w 2015 r.
Jim Balter
1

Chociaż mogą być jedynymi niedozwolonymi znakami uniksowymi /i NULLchociaż należy wziąć pod uwagę interpretację wiersza poleceń.

Na przykład, chociaż nazwanie pliku 1>&2lub 2>&1w systemie Unix może być legalne , takie nazwy plików mogą być błędnie interpretowane, gdy są używane w wierszu poleceń.

Podobnie może być możliwe nazwanie pliku $PATH, ale przy próbie dostępu do niego z wiersza poleceń powłoka przełoży się $PATHna wartość zmiennej.

Dogg Bookins
źródło
dla literałów w bash, najlepszym sposobem znalazłem zadeklarować literały bez interpolacji $'myvalueis', ex: $ echo 'hi' > $'2>&1', cat 2\>\&1„hi”
ThorSummoner
1

Trudności ze zdefiniowaniem, co jest legalne, a które nie, zostały już zaadresowane i zasugerowano białe listy . Ale system Windows obsługuje znaki większe niż 8-bitowe . Wikipedia stwierdza , że (na przykład)

dwukropek modyfikatora [( patrz 7. poniżej )] jest czasami używany w nazwach plików Windows, ponieważ jest identyczny z dwukropkiem w czcionce Segoe UI używanej dla nazw plików. Samo [odziedziczone ASCII] dwukropek jest niedozwolony.

Dlatego chcę przedstawić znacznie bardziej liberalne podejście przy użyciu znaków Unicode zamiast „nielegalnych”. Znalazłem wynik w moim porównywalnym przypadku użycia o wiele bardziej czytelnym. Poszukaj na przykład tego bloku . Ponadto możesz nawet przywrócić z tego oryginalną zawartość. Możliwe wybory i badania znajdują się na poniższej liście:

  1. Zamiast *( U+002A * ASTERISK) możesz użyć jednego z wielu wymienionych, na przykład U+2217 ∗ (ASTERISK OPERATOR)lubFull Width Asterisk U+FF0A *
  2. Zamiast tego .możesz na przykład użyć jednego z nich⋅ U+22C5 dot operator
  3. Zamiast tego "możesz użyć “ U+201C english leftdoublequotemark(alternatywy patrz tutaj )
  4. Zamiast /( / SOLIDUS U+002F) możesz użyć ∕ DIVISION SLASH U+2215(inne tutaj )
  5. Zamiast \( \ U+005C Reverse solidus) możesz użyć ⧵ U+29F5 Reverse solidus operator( więcej )
  6. Zamiast [( U+005B Left square bracket) i ]( U+005D Right square bracket) możesz użyć na przykład U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETi U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET( stąd więcej możliwości tutaj )
  7. Zamiast tego :możesz użyć U+2236 ∶ RATIO (for mathematical usage)lub U+A789 ꞉ MODIFIER LETTER COLON(patrz dwukropek (litera) , czasem używany w nazwach plików Windows, ponieważ jest identyczny z dwukropkiem w czcionce Segoe UI używanej do nazw plików. Sam dwukropek jest niedozwolony) (patrz tutaj )
  8. Zamiast tego ;możesz użyć U+037E ; GREEK QUESTION MARK(patrz tutaj )
  9. Dla |istnieją jakieś dobre zamienniki, takie jak: U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDESlub U+01C0 ǀ LATIN LETTER DENTAL CLICK( Wikipedia ). Również znaki do rysowania w ramkach zawierają różne inne opcje.
  10. Zamiast ,( , U+002C COMMA) możesz na przykład użyć ‚ U+201A SINGLE LOW-9 QUOTATION MARK(patrz tutaj )
  11. Dla ?( U+003F ? QUESTION MARK) są to dobrzy kandydaci: U+FF1F ? FULLWIDTH QUESTION MARKlub U+FE56 ﹖ SMALL QUESTION MARK(z jego reszty dwa kolejne z Dingbats Block , szukać „pytanie”)
Cadoiz
źródło
0

Podczas tworzenia skrótów internetowych w systemie Windows, aby utworzyć nazwę pliku, pomija niedozwolone znaki, z wyjątkiem ukośnika, który jest konwertowany na minus.

Matthias Ronge
źródło
3
„nie odpowiedź… odrzucona - moderator sprawdził twoją flagę, ale nie znalazł dowodów na jej poparcie”. Chyba sobie żartujesz. Poproszę lepszych moderatorów.
Jim Balter,
-1

W powłokach uniksowych możesz cytować prawie każdą postać w pojedynczym cudzysłowie '. Z wyjątkiem samego pojedynczego cudzysłowu i nie można wyrazić znaków kontrolnych, ponieważ \nie jest rozwinięty. Dostęp do samego cytatu z cytowanego ciągu jest możliwy, ponieważ można łączyć łańcuchy z pojedynczymi i podwójnymi cudzysłowami, podobnie jak w 'I'"'"'m'przypadku dostępu do pliku o nazwie"I'm" (tutaj można również podwójnego cudzysłowu).

Dlatego należy unikać wszystkich znaków kontrolnych, ponieważ są one zbyt trudne do wprowadzenia do powłoki. Reszta jest nadal zabawna, zwłaszcza pliki zaczynające się od myślnika, ponieważ większość poleceń odczytuje je jako opcje, chyba że masz dwa myślniki --wcześniej lub podasz je za pomocą ./, co również ukrywa początek -.

Jeśli chcesz być miły, nie używaj żadnych znaków używanych przez powłokę i typowe polecenia jako elementy składniowe, czasem zależne od pozycji, więc np. Możesz nadal używać -, ale nie jako pierwszego znaku; podobnie ., możesz użyć go jako pierwszego znaku tylko wtedy, gdy masz na myśli („ukryty plik”). Kiedy masz na myśli, twoje nazwy plików to sekwencje specjalne VT100 ;-), więc ls zniekształca dane wyjściowe.

czwarty42
źródło
Pytanie nie dotyczy muszli.
Jim Balter
-8

Miałem tę samą potrzebę i szukałem rekomendacji lub standardowych referencji i natknąłem się na ten wątek. Moja obecna czarna lista znaków, których należy unikać w nazwach plików i katalogów, to:

$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" -> "@"
};
Meng Lu
źródło
4
czy mógłbyś komentować posiadanie @na liście?
PypeBros,
8
Pytanie brzmiało, które postacie są nielegalne. Większość znaków na liście jest legalna.
Nigel Alderton
6
list b? lol, zakładam, że to jest b lank spaces... cóż, które wciąż pozostawia kilka ... (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
Zmieniłem