Welche Zeichen sind in Windows- und Linux-Verzeichnisnamen verboten?

355

Ich weiß, dass / unter Linux illegal ist, und die folgenden sind unter Windows illegal (glaube ich) * . " / \ [ ] : ; | ,

Was fehlt mir noch?

Ich benötige jedoch eine umfassende Anleitung, die Doppelbyte-Zeichen berücksichtigt. Das Verknüpfen mit externen Ressourcen ist für mich in Ordnung.

Ich muss zuerst ein Verzeichnis im Dateisystem mit einem Namen erstellen, der möglicherweise verbotene Zeichen enthält. Daher plane ich, diese Zeichen durch Unterstriche zu ersetzen. Ich muss dann dieses Verzeichnis und seinen Inhalt in eine Zip-Datei (mit Java) schreiben, daher wäre jeder zusätzliche Rat bezüglich der Namen von Zip-Verzeichnissen willkommen.

Jeff
quelle
13
Einige der von Ihnen erwähnten Zeichen sind unter Windows tatsächlich zulässig. Überprüfen Sie dies:echo abc > "ab.;,=[1]"
Dolmen
3
Vergessen Sie auch nicht, dass <und> unter Windows illegal sind.
AnotherParker
4
/ ist unter Linux nicht illegal. Sie müssen es nur mit einem \ entkommen, wenn Sie es eingeben.
David C. Bishop
5
@ DavidC.Bishop: In diesem SO-Beitrag wird behauptet, dass der Linux-Kernel Sie daran hindert, mit einem Dateinamen zu arbeiten, der einen Schrägstrich enthält. Konnten Sie es zum Laufen bringen?
Soren Bjornstad
14
"/ ist unter Linux nicht illegal. Sie müssen es nur mit einem \ maskieren, wenn Sie es eingeben" - diese Aussage ist völlig falsch. Dateinamenkomponenten dürfen / nicht enthalten, und das Escapezeichen hat keine Auswirkung.
Jim Balter

Antworten:

215

Eine „umfassende Anleitung“ für verbotene Dateinamenzeichen funktioniert unter Windows nicht, da sowohl Dateinamen als auch Zeichen reserviert werden. Ja, Zeichen wie * " ?und andere sind verboten, aber es gibt unendlich viele Namen, die nur aus gültigen Zeichen bestehen, die verboten sind. Beispielsweise sind Leerzeichen und Punkte gültige Dateinamenzeichen, aber Namen, die nur aus diesen Zeichen bestehen, sind verboten.

Windows unterscheidet nicht zwischen Groß- und Kleinbuchstaben. Sie können daher keinen Ordner mit dem Namen erstellen, Awenn bereits ein Name avorhanden ist. Schlimmer noch, scheinbar erlaubte Namen wie PRNund CONund viele andere sind reserviert und nicht erlaubt. Windows hat auch mehrere Längenbeschränkungen. Ein in einem Ordner gültiger Dateiname kann ungültig werden, wenn er in einen anderen Ordner verschoben wird. Die Regeln zum Benennen von Dateien und Ordnern finden Sie in den Microsoft-Dokumenten.

Sie können im Allgemeinen keinen benutzergenerierten Text verwenden, um Windows-Verzeichnisnamen zu erstellen. Wenn Sie etwas zu benennen , damit die Benutzer , was sie wollen, müssen Sie wie sichere Namen erstellen A, AB, A2et al., Speichern von benutzergenerierten Namen und deren Pfad Äquivalente in einer Anwendungsdatendatei und Pfadzuordnung in Ihrer Anwendung auszuführen.

Wenn Sie vom Benutzer generierte Ordnernamen unbedingt zulassen müssen, können Sie nur feststellen, ob sie ungültig sind, indem Sie Ausnahmen abfangen und davon ausgehen, dass der Name ungültig ist. Selbst das ist mit Gefahren verbunden, da sich die Ausnahmen für verweigerten Zugriff, Offline-Laufwerke und Speicherplatz außerhalb des Laufwerks mit denen überschneiden, die für ungültige Namen ausgelöst werden können. Sie öffnen eine riesige Dose mit Verletzungen.

Dour High Arch
quelle
11
Die Schlüsselphrase aus dem MSDN-Link lautet "[und ein] anderes Zeichen, das das Zieldateisystem nicht zulässt". Unter Windows gibt es möglicherweise verschiedene Dateisysteme. Einige erlauben möglicherweise Unicode, andere nicht. Im Allgemeinen besteht die einzige sichere Möglichkeit, einen Namen zu überprüfen, darin, ihn auf dem Zielgerät zu testen.
Adrian McCarthy
72
Es gibt einige Richtlinien, und "es gibt unendlich viele Namen, die nur aus gültigen Zeichen bestehen, die verboten sind" ist nicht konstruktiv. Ebenso „Windows nicht zwischen Groß- unterscheidet und Kleinbuchstabe“ ist eine dumme Ausnahme - die OP ist über Syntax fragen und nicht die Semantik und keine rechtschaffen Leute würden sagen , dass ein Dateiname wie A.txtwar ungültig , weil a.TXTexistiert.
Borodin
9
COPY CON PRNbedeutet, von der Tastatureingabe oder einem möglichen Standard zu lesen und auf das Druckergerät zu kopieren. Ich bin mir nicht sicher, ob es für moderne Fenster noch gültig ist, war es aber schon lange. Früher konnte man damit Text eingeben und von einem Nadeldrucker einfach ausgeben lassen.
AntonPiatek
6
"ist nicht konstruktiv" - im Gegenteil, es ist eine Tatsache. Was nicht konstruktiv ist, ist Borodins Kampfbereitschaft.
Jim Balter
3
"Im Allgemeinen können Sie keinen benutzergenerierten Text verwenden, um Windows-Verzeichnisnamen zu erstellen." <- Wenn Sie dies tun möchten, können Sie einfach eine Zeichen-Whitelist erstellen, die weitgehend funktioniert, wenn Sie das bereits vorhandene Problem ignorieren können.
Casey
532

Lassen Sie es uns einfach halten und zuerst die Frage beantworten.

  1. Die verbotenen druckbaren ASCII-Zeichen sind:

    • 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. Nicht druckbare Zeichen

    Wenn Ihre Daten aus einer Quelle stammen, die nicht druckbare Zeichen zulässt, müssen Sie nach weiteren Daten suchen.

    • Linux / Unix:

      0 (NULL byte)
      
    • Windows:

      0-31 (ASCII control characters)
      

    Hinweis: Während es unter Linux / Unix-Dateisystemen legal ist, Dateien mit Steuerzeichen im Dateinamen zu erstellen, kann es für die Benutzer ein Albtraum sein, mit solchen Dateien umzugehen .

  3. Reservierte Dateinamen

    Die folgenden Dateinamen sind reserviert:

    • Windows:

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

      (sowohl alleine als auch mit beliebigen Dateierweiterungen, z LPT1.txt. B. ).

  4. Andere Regeln

    • Windows:

      Dateinamen dürfen nicht mit einem Leerzeichen oder einem Punkt enden.

Christopher Oezbek
quelle
5
Die meisten Windows-Dateisysteme sind nicht auf 8-Bit-Zeichen beschränkt. Es gibt viele andere 8-Bit-Zeichen (NUL, Steuerzeichen), die unter Windows verboten sind. Selbst wenn man diese berücksichtigt, kann der Fragesteller nicht "ein Verzeichnis im Dateisystem erstellen", wie er gefragt hat, da es unendlich viele ungültige Verzeichnisnamen gibt, die aus nicht verbotenen Zeichen bestehen.
Dour High Arch
38
Andere haben das bereits gesagt und es ist nicht konstruktiv. Als ich hierher kam, um nach einer Antwort zu suchen, wollte ich die Liste, die ich an anderer Stelle sammeln musste: Welche Zeichen sollen aus Benutzereingaben herausgefiltert werden, wenn ein guter Versuch mit einem gültigen Dateinamen erstellt wird. Die Frage, ob Zeichen zusammen ungültig werden, muss möglicherweise noch näher erläutert werden.
Christopher Oezbek
5
Ein NULL-Zeichen ist auch unter Linux verboten.
Dan Jones
3
Zeilenumbrüche sind unter Linux nicht verboten. Ich würde jedoch argumentieren, dass dies der Fall sein sollte ... und wenn NUL unter Linux verboten ist, dann ist es unter Windows verboten und erfüllt denselben Zweck.
Alcaro
11
@ Soaku: Natürlich nicht, da sich die Welt nicht um Microsoft dreht. Warum unnötige Einschränkungen hinzufügen, wenn es nur zwei Zeichen gibt, die unbedingt verboten werden müssen?
Firegurafiku
67

Unter Linux und anderen Unix-bezogenen Systemen gibt es nur zwei Zeichen, die nicht im Namen einer Datei oder eines Verzeichnisses erscheinen können. Dies sind NUL '\0'und Schrägstrich '/'. Der Schrägstrich kann natürlich in einem Pfadnamen erscheinen, der die Verzeichniskomponenten trennt.

Gerücht 1 hat es , dass Steven Bourne (von ‚Shell‘ Ruhm) hatte ein Verzeichnis mit 254 Dateien, einen für jeden einzelnen Buchstaben (Zeichencode) , die in einem Dateinamen ( mit Ausnahme erscheinen /, '\0', der Name .war das aktuelle Verzeichnis, natürlich ). Es wurde verwendet, um die Bourne-Shell zu testen und routinemäßig Chaos an unachtsamen Programmen wie Sicherungsprogrammen zu verursachen.

Andere Personen haben die Windows-Regeln behandelt.

Beachten Sie, dass MacOS X über ein Dateisystem verfügt, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.


1 Es war Kernighan & Pike in der Praxis des Programmierens, der dies in Kapitel 6, Testen, §6.5 Stresstests, sagte:

Als Steve Bourne seine Unix-Shell schrieb (die als Bourne-Shell bekannt wurde), erstellte er ein Verzeichnis mit 254 Dateien mit Ein-Zeichen-Namen, einen für jeden Byte-Wert außer '\0'und Schrägstrich, die beiden Zeichen, die in Unix nicht vorkommen können Dateinamen. Er benutzte dieses Verzeichnis für alle Arten von Tests zur Mustererkennung und Tokenisierung. (Das Testverzeichnis wurde natürlich von einem Programm erstellt.) Für Jahre danach war dieses Verzeichnis der Fluch von File-Tree-Walking-Programmen; es prüfte sie bis zur Zerstörung.

Beachten Sie, dass das Verzeichnis Einträge enthalten muss .und ..es sich also wohl um 253 Dateien (und 2 Verzeichnisse) oder 255 Namenseinträge anstatt um 254 Dateien handelte. Dies hat keinen Einfluss auf die Wirksamkeit der Anekdote oder die darin beschriebenen sorgfältigen Tests.

Jonathan Leffler
quelle
1
254 Dateien? Und was ist mit utf8?
j_kubik
20
Die 254 Dateien waren alle einstellige Dateinamen, einer pro Zeichen, der in einem Dateinamen zulässig war. UTF-8 war nicht einmal ein Schimmer im Auge, als Steve Bourne die Bourne-Shell schrieb. UTF-8 legt Regeln für die gültigen Bytesequenzen fest (und lässt die Bytes 0xC0, 0xC1, 0xF5-0xFF insgesamt nicht zu). Ansonsten ist es nicht viel anders - auf der Detailebene, die ich diskutiere.
Jonathan Leffler
1
Das On-Disk-Verzeichnis-Trennzeichen für MacOS HFS + -Dateisysteme ist eigentlich ein ':' und kein '/'. Das Betriebssystem macht normalerweise (wahrscheinlich immer) das Richtige, wenn Sie mit * nix-APIs arbeiten. Erwarten Sie jedoch nicht, dass dies zuverlässig geschieht, wenn Sie in die OSX-Welt wechseln, z. B. mit Applescript. Es sieht so aus, als ob Cocoa-APIs das / verwenden und das: auch vor Ihnen verbergen, aber ich bin mir ziemlich sicher, dass die alten Carbon-APIs dies nicht tun.
Dan Pritts
@DanPritts Ich habe in den Xcode-Einstellungen ein benutzerdefiniertes Schrift- / Farbschema erstellt und es mit einem /im Namen benannt. Das verursachte einige Probleme, als es ein neues Verzeichnis mit dem Schema in erstellte.
Andreas
Beachten Sie, dass Sie ein Verzeichnis nicht zu einer Unix- PATHVariablen hinzufügen können, wenn ein Verzeichnis einen Doppelpunkt enthält, da der Doppelpunkt als Trennzeichen verwendet wird (Semikolon unter Windows). Programme in einem solchen Verzeichnis müssen also entweder mit einem Pfadnamen ausgeführt werden, der angibt, wo sie sich befinden (kann relativ oder absolut sein), oder Sie müssen sich im Verzeichnis befinden und einen Punkt ( .das aktuelle Verzeichnis) haben PATH, der allgemein als angesehen wird eine unsichere.
Jonathan Leffler
36

Anstatt eine schwarze Liste mit Zeichen zu erstellen, können Sie auch eine Whitelist verwenden . Alles in allem ist der Zeichenbereich, der in einem Datei- oder Verzeichnisnamenskontext sinnvoll ist, recht kurz. Wenn Sie keine sehr spezifischen Namensanforderungen haben, werden Ihre Benutzer ihn nicht für Ihre Anwendung verwenden, wenn sie nicht die gesamte ASCII-Tabelle verwenden können.

Das Problem der reservierten Namen im Zieldateisystem wird nicht gelöst, aber mit einer Whitelist ist es einfacher, die Risiken an der Quelle zu mindern.

In diesem Sinne ist dies eine Reihe von Charakteren, die als sicher angesehen werden können:

  • Buchstaben (az AZ) - Bei Bedarf auch Unicode-Zeichen
  • Ziffern (0-9)
  • Unterstrich (_)
  • Bindestrich (-)
  • Raum
  • Punkt (.)

Und alle zusätzlichen sicheren Zeichen, die Sie zulassen möchten. Darüber hinaus müssen Sie nur einige zusätzliche Regeln für Leerzeichen und Punkte durchsetzen . Dies ist normalerweise ausreichend:

  • Der Name muss mindestens einen Buchstaben oder eine Zahl enthalten (um nur Punkte / Leerzeichen zu vermeiden).
  • Der Name muss mit einem Buchstaben oder einer Zahl beginnen (um führende Punkte / Leerzeichen zu vermeiden).
  • Der Name darf nicht mit einem Punkt oder Leerzeichen enden (schneiden Sie diese einfach ab, falls vorhanden, wie es der Explorer tut).

Dies erlaubt bereits recht komplexe und unsinnige Namen. Diese Namen wären beispielsweise mit diesen Regeln möglich und unter Windows / Linux gültige Dateinamen:

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

Im Wesentlichen sollten Sie auch bei so wenigen Zeichen auf der Whitelist entscheiden, was tatsächlich Sinn macht, und den Namen entsprechend validieren / anpassen. In einer meiner Anwendungen habe ich die gleichen Regeln wie oben verwendet, jedoch doppelte Punkte und Leerzeichen entfernt.

AeonOfTime
quelle
15
Und was ist mit meinen nicht englischsprachigen Benutzern, die alle davon verarscht wären?
pkh
2
@pkh: Wie ich in meinem Beitrag erwähnt habe, würden Sie alle erforderlichen Unicode-Zeichen in Ihre Whitelist aufnehmen. Zeichenbereiche können normalerweise recht einfach angegeben werden, insbesondere wenn Sie beispielsweise reguläre Ausdrücke verwenden.
AeonOfTime
2
Wir verwenden einen Whitelist-Ansatz, aber vergessen Sie nicht, dass Sie unter Windows reservierte, case-unabhängige Zeichenfolgen wie Gerätenamen (prn, lpt1, con) und verwalten müssen. und ..
Tahoar
2
Sie haben die Windows-Einschränkung verpasst: darf nicht mit einem Punkt oder Leerzeichen enden.
Martin Bonner unterstützt Monica
1
"Alles in allem ist der Zeichenbereich, der in einem Datei- oder Verzeichnisnamenskontext sinnvoll ist, ziemlich kurz." Vielleicht für einige Anwendungsfälle. Ich arbeite an einem Projekt mit Mediendateien in 20 Sprachen. Die Dateinamen müssen den Titel des Medienelements widerspiegeln, da Endbenutzer den Inhalt auf diese Weise finden. Viele der Namen verwenden Interpunktion. Jede Einschränkung von Dateinamenzeichen ist mit einem Preis verbunden. In diesem Fall müssen wir die Einschränkungen minimieren. In diesem Anwendungsfall ist der Bereich der Zeichen, die in einem Dateinamen keinen Sinn ergeben, viel kürzer und einfacher als die, die dies tun.
LarsH
29

Die einfache Möglichkeit, Windows dazu zu bringen, Ihnen die Antwort mitzuteilen, besteht darin, zu versuchen, eine Datei über den Explorer umzubenennen und / für den neuen Namen einzugeben. Windows öffnet ein Meldungsfeld mit der Liste der unzulässigen Zeichen.

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

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

chrisjej
quelle
28

Wenn Sie nur zu Forschungszwecken arbeiten, sollten Sie sich diesen Wikipedia-Eintrag zu Dateinamen ansehen .

Wenn Sie eine tragbare Funktion schreiben möchten, um Benutzereingaben zu validieren und darauf basierend Dateinamen zu erstellen, lautet die kurze Antwort " Nicht" . Schauen Sie sich ein tragbares Modul wie Perls File :: Spec an, um einen Einblick in alle Hops zu erhalten, die für eine solche "einfache" Aufgabe erforderlich sind.

Leonardo Herrera
quelle
5

Unter Windows können Sie dies mit PowerShell überprüfen

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

Um UTF-8-Codes anzuzeigen, können Sie konvertieren

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

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

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
Wojciech Sciesinski
quelle
Für diejenigen, die PowershelI nicht sprechen, ist $ FileNameInvalidChars 0x00 bis 0x1F und: "<> | *? \ /
Robin Davies
4

In Windows 10 (2019) sind die folgenden Zeichen durch einen Fehler verboten, wenn Sie versuchen, sie einzugeben:

Ein Dateiname darf keines der folgenden Zeichen enthalten:

\ / : * ? " < > |

Bret Cameron
quelle
3

Hier ist eine AC # -Implementierung für Windows basierend auf der Antwort von Christopher Oezbek

Es wurde durch den Booleschen Wert "enthältFolder" komplexer, deckt aber hoffentlich alles ab

/// <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
quelle
Ich habe drei Fragen: 1. Warum haben Sie StringBuildermit dem anfänglichen Kapazitätswert initialisiert ? 2. Warum haben Sie 12 zur Länge des hinzugefügt filename? 3. Wurden 12 willkürlich ausgewählt oder gab es einen Gedanken hinter dieser Zahl?
Iiminov
2

Bis zum 18.04.2017 ist unter den Antworten auf dieses Thema keine einfache schwarze oder weiße Liste von Zeichen und Dateinamen ersichtlich - und es gibt viele Antworten.

Der beste Vorschlag, den ich machen konnte, war, den Benutzer die Datei benennen zu lassen, wie er möchte. Verwenden Sie eine Fehlerbehandlungsroutine, wenn die Anwendung versucht, die Datei zu speichern, fangen Sie Ausnahmen ab, nehmen Sie an, dass der Dateiname schuld ist (offensichtlich nachdem Sie sichergestellt haben, dass der Speicherpfad ebenfalls in Ordnung ist), und fordern Sie den Benutzer zur Eingabe eines neuen Dateinamens auf. Um die besten Ergebnisse zu erzielen, platzieren Sie dieses Überprüfungsverfahren in einer Schleife, die fortgesetzt wird, bis der Benutzer es richtig macht oder aufgibt. Hat am besten für mich funktioniert (zumindest in VBA).

FCastro
quelle
1
Ihre Antwort @FCastro ist aus technischer Sicht richtig. Aus UX-Sicht ist es jedoch ein Albtraum - der Benutzer ist gezwungen, das Spiel "Typ etwas und ich werde Ihnen sagen, ob Sie erfolgreich sind" immer wieder zu spielen. Ich möchte lieber eine Nachricht (Warnstil) sehen, die dem Benutzer mitteilt, dass er ein unzulässiges Zeichen eingegeben hat, das später konvertiert wird.
Mike
Christopher Oezbek stellte 2015 eine solche schwarze Liste zur Verfügung.
Jim Balter
1

Obwohl die einzigen illegalen Unix-Zeichen sein könnten /und NULL, obwohl einige Überlegungen zur Befehlszeileninterpretation enthalten sein sollten.

Während es beispielsweise legal sein kann, eine Datei 1>&2oder 2>&1unter Unix zu benennen , können Dateinamen wie diese bei der Verwendung in einer Befehlszeile falsch interpretiert werden.

Ebenso ist es möglich, eine Datei zu benennen $PATH, aber wenn Sie versuchen, über die Befehlszeile darauf zuzugreifen, wird die Shell $PATHin ihren Variablenwert übersetzt .

Dogg Bookins
quelle
für Literale in BASH, die beste Art und Weise habe ich festgestellt Literale erklären , ohne Interpolation $'myvalueis', ex: $ echo 'hi' > $'2>&1', cat 2\>\&1„hallo“
ThorSummoner
1

Schwierigkeiten bei der Definition, was legal ist und was nicht, wurden bereits angesprochen und Whitelists vorgeschlagen . Windows unterstützt jedoch mehr als 8-Bit- Zeichen. Wikipedia gibt an , dass (zum Beispiel) die

Der Modifikator- Doppelpunkt [( siehe 7. unten )] wird manchmal in Windows-Dateinamen verwendet, da er mit dem Doppelpunkt in der für Dateinamen verwendeten Segoe-UI- Schriftart identisch ist . Der Doppelpunkt [geerbter ASCII] selbst ist nicht zulässig.

Daher möchte ich einen viel liberaleren Ansatz vorstellen, bei dem Unicode-Zeichen verwendet werden, um die "illegalen" zu ersetzen. Ich fand das Ergebnis in meinem vergleichbaren Anwendungsfall weitaus lesbarer. Schauen Sie zum Beispiel in diesen Block . Außerdem können Sie sogar den ursprünglichen Inhalt wiederherstellen. Mögliche Auswahlmöglichkeiten und Recherchen finden Sie in der folgenden Liste:

  1. Statt *( U+002A * ASTERISK), können Sie eine der vielen aufgelistet, zum Beispiel U+2217 ∗ (ASTERISK OPERATOR)oder dieFull Width Asterisk U+FF0A *
  2. Statt ., können Sie einen von verwenden diese , zum Beispiel⋅ U+22C5 dot operator
  3. Stattdessen "können Sie verwenden “ U+201C english leftdoublequotemark(Alternativen siehe hier )
  4. Anstelle von /( / SOLIDUS U+002F) können Sie ∕ DIVISION SLASH U+2215(andere hier ) verwenden.
  5. Anstelle von \( \ U+005C Reverse solidus) können Sie ⧵ U+29F5 Reverse solidus operator( more ) verwenden.
  6. Anstelle von [( U+005B Left square bracket) und ]( U+005D Right square bracket) können Sie zum Beispiel U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETund U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET(von hier aus mehr Möglichkeiten hier ) verwenden.
  7. Stattdessen :können Sie U+2236 ∶ RATIO (for mathematical usage)oder U+A789 ꞉ MODIFIER LETTER COLON(siehe Doppelpunkt (Buchstabe)) verwenden , der manchmal in Windows-Dateinamen verwendet wird, da er mit dem Doppelpunkt in der für Dateinamen verwendeten Segoe-UI- Schriftart identisch ist . Der Doppelpunkt selbst ist nicht zulässig.) (Siehe hier )
  8. Stattdessen ;können Sie verwenden U+037E ; GREEK QUESTION MARK(siehe hier )
  9. Für |gibt es einige gute Substitute wie: U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDESoder U+01C0 ǀ LATIN LETTER DENTAL CLICK( Wikipedia ). Auch die Boxzeichen enthalten verschiedene andere Optionen.
  10. Anstelle von ,( , U+002C COMMA) können Sie zum Beispiel verwenden ‚ U+201A SINGLE LOW-9 QUOTATION MARK(siehe hier )
  11. Für ?( U+003F ? QUESTION MARK), das sind gute Kandidaten: U+FF1F ? FULLWIDTH QUESTION MARKoder U+FE56 ﹖ SMALL QUESTION MARK(aus er wieder zwei weiteren von Dingbats - Block , für „Frage“ suchen)
Cadoiz
quelle
0

Beim Erstellen von Internetverknüpfungen in Windows werden beim Erstellen des Dateinamens unzulässige Zeichen übersprungen, mit Ausnahme des Schrägstrichs, der in Minus konvertiert wird.

Matthias Ronge
quelle
3
"Keine Antwort ... abgelehnt - ein Moderator hat Ihre Flagge überprüft, aber keine Beweise dafür gefunden". Du willst mich wohl veralbern. Bitte bessere Moderatoren.
Jim Balter
-1

In Unix-Shells können Sie fast jedes Zeichen in einfache Anführungszeichen setzen '. Außer dem einfachen Anführungszeichen selbst, und Sie können keine Steuerzeichen ausdrücken, da \es nicht erweitert ist. Der Zugriff auf das einfache Anführungszeichen selbst aus einer Zeichenfolge in Anführungszeichen heraus ist möglich, da Sie Zeichenfolgen mit einfachen und doppelten Anführungszeichen verketten können, wie 'I'"'"'m'sie für den Zugriff auf eine Datei mit dem Namen verwendet werden können "I'm"(doppeltes Anführungszeichen auch hier möglich).

Sie sollten daher alle Steuerzeichen vermeiden, da sie zu schwer in die Shell einzugeben sind. Der Rest ist immer noch lustig, insbesondere Dateien, die mit einem Bindestrich beginnen, da die meisten Befehle diese als Optionen lesen, es sei denn, Sie haben zuvor zwei Bindestriche --oder Sie geben sie mit an ./, wodurch auch der Start ausgeblendet wird -.

Wenn Sie nett sein möchten, verwenden Sie keine der Zeichen, die die Shell und typische Befehle als syntaktische Elemente verwenden, manchmal positionsabhängig, z. B. können Sie sie weiterhin verwenden -, jedoch nicht als erstes Zeichen. Ebenso .können Sie es nur dann als erstes Zeichen verwenden, wenn Sie es ernst meinen ("versteckte Datei"). Wenn Sie gemein sind, sind Ihre Dateinamen VT100-Escape-Sequenzen ;-), so dass ein ls die Ausgabe verstümmelt.

hery42
quelle
Die Frage betrifft nicht Muscheln.
Jim Balter
-8

Ich hatte das gleiche Bedürfnis und suchte nach Empfehlungen oder Standardreferenzen und stieß auf diesen Thread. Meine aktuelle schwarze Liste von Zeichen, die in Datei- und Verzeichnisnamen vermieden werden sollten, ist:

$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
quelle
4
Würde es Ihnen etwas ausmachen, @die Liste zu kommentieren ?
PypeBros
8
Die Frage war, welche Zeichen illegal sind. Die meisten Zeichen in Ihrer Liste sind legal.
Nigel Alderton
6
der Brief b? lol, ich nehme an, das ist das b von lank spaces... nun, das lässt noch ein paar (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpgübrig ... Ich habe ein Bild umbenannt , musste es aber zurück ändern, weil es wütend aussah ...
ashleedawg