Welche Zeichen sind in plattformübergreifenden Dateinamen für Linux, Windows und OS-X sicher?

60

Derzeit benutze ich YYMMDD-NAME+PAGEfür die meisten meiner Dateien einen Namen. NAMELeerzeichen werden in Unterstriche umgewandelt.

Ich möchte das YYYY-MM-DDDatumsformat verwenden, bin mir aber nicht sicher, wie ich es vom Namen trennen soll. A -würde seltsam aussehen, wenn der Name mit einer Zahl beginnen würde. Wenn ich a benutze _, widerspricht es dem Unterstrich, der ein Leerzeichen darstellt.

Welche Zeichen sind in Dateinamen relativ sicher, die hier funktionieren würden? Ich bin unter Linux, teile aber möglicherweise Dateien mit anderen (Windows 7, Mac OS X).

Martin Ueding
quelle
… Unter Unix, Windows, einem Amiga 1000?
Slhck
Meistens modernes Linux.
Martin Ueding
- Symbol ist sicher auf Windows 7 zu verwenden .. kann andere moderne Betriebssysteme das gleiche tun .. Sie können Minus-Symbol verwenden, um zu trennen ..
Niranjan Singh
mögliche Cross - Site - Duplikat: stackoverflow.com/questions/4814040/...
Ciro Santilli新疆改造中心法轮功六四事件

Antworten:

48

Zusammenfassung:

  • Windows: alles außer ASCII-Steuerzeichen und \/:*?"<>|
  • Linux, OS-X: alles außer null oder /

Auf allen Plattformen ist es am besten, nicht druckbare Zeichen wie die ASCII-Steuerzeichen zu vermeiden.

Windows

In Windows erlaubt der Windows Explorer keine Steuerzeichen oder \/:*?"<>|Sie können Leerzeichen verwenden. Wenn Sie Leerzeichen verwenden, müssen Sie den Dateinamen häufig in Anführungszeichen setzen, wenn Sie ihn über die Befehlszeile eingeben (GUI-Apps sind meines Wissens jedoch nicht betroffen). Windows-Dateisysteme wie NTFS speichern anscheinend die Kodierung mit dem Dateinamen, aber UTF-16 ist Standard.

Bei einigen Teilen von Windows wird zwischen Groß- und Kleinschreibung unterschieden, bei anderen Teilen wird zwischen Groß- und Kleinschreibung nicht unterschieden. Es ist einfach, unterschiedliche Dateinamen wie "Ab" und "ab" in einem Windows NTFS-Dateisystem zu erstellen. Diese Namen beziehen sich auf separate Dateien, die unterschiedliche Inhalte enthalten. Obwohl die Windows-Eingabeaufforderung beide Dateien mit glücklich auflistet dir, können Sie mit Befehlen wie nicht einfach auf eine von ihnen zugreifen oder sie bearbeiten type. Siehe unten.

Linux, OS-X

Unter Linux und OS-X /ist meines Erachtens nur der druckbare ASCII-Satz verboten. Einige Zeichen (z. B. Shell-Metazeichen *?!) verursachen Probleme in der Befehlszeile und erfordern, dass der Dateiname in Anführungszeichen gesetzt oder mit Escapezeichen versehen wird.

Linux-Dateisysteme wie ext2, ext3 sind zeichenunabhängig (ich denke, sie behandeln es nur mehr oder weniger als Byte-Stream - nur Nullen und /sind verboten). Dies bedeutet, dass Sie Dateinamen in UTF-8-Codierung speichern können. Ich glaube, es liegt an der Shell oder einer anderen Anwendung, zu wissen, welche Codierung verwendet werden muss, um den Dateinamen ordnungsgemäß für die Anzeige oder Verarbeitung zu konvertieren.

Fazit

Sie könnten also sicher so etwas verwenden (wenn es nicht so schwer zu tippen wäre)


Groß- / Kleinschreibung in Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Beachten Sie, dass wir den Inhalt der zweiten Datei nicht eingeben können. Der Windows- typeBefehl gibt stattdessen nur den Inhalt von Ab zurück. Die dritte Datei würde sich auch unter Linux von aB unterscheiden.

(Windows 10 NTFS).

RedGrittyBrick
quelle
1
Alles in allem eine gute Antwort, aber ich würde auf die Verwendung von Dateinamen in Leerzeichen verzichten. Es ist mehr Mühe als es wert ist, sie in allen Kontexten richtig zu entkommen. Beachten Sie, dass Microsoft keinen Speicherplatz mehr in Systemverzeichnisnamen verwendet. Wenn Sie in Namen Wortgrenzen angeben müssen, funktioniert CamelCase einwandfrei.
Isaac Rabinovitch
4
"C: \ Programme (x86)" existiert noch in Win8 - ist das kein Systemverzeichnis? Ich bin damit einverstanden, dass Leerzeichen Probleme verursachen können.
RedGrittyBrick
Es ist, aber es kann in so ziemlich alles umbenannt werden. Natürlich werden viele Programme ausflippen, wenn Sie es in "]: \ foobar" umbenennen, aber Windows bezeichnet es trotzdem als "% programfiles (x86)%".
Marcks Thomas
2
Hier ist zu beachten, dass Linux-Systeme Groß- und Kleinbuchstaben als unterschiedlich betrachten können, während Windows sie als gleich ansieht.
Thecoshman
1
Sie wären überrascht, wie viele Programme beim Parsen scheiße sind. Aus diesem Grund gab es kein Windows 9.
Isaac Rabinovitch
46

Während die Antwort von RedGrittyBrick technisch korrekt ist, ist Sicherheit nicht das einzige Problem: Benutzerfreundlichkeit ist auch wichtig. Ich denke, eine bessere Frage ist, "welche Zeichen in einem Dateinamen gut zu verwenden sind".

Einige mögliche Richtlinien:

  • [0-9a-zA-Z_] - Alphanumerische Zeichen und der Unterstrich sind immer in Ordnung.
  • \/:*?"<>|und das Null-Byte sind auf mindestens einem System problematisch und sollten immer vermieden werden.
  • Auf vielen Systemen werden Leerzeichen als Argumenttrennzeichen verwendet, daher sollten Dateinamen mit Leerzeichen nach Möglichkeit vermieden werden. Andere Leerzeichen (z. B. Tabulatoren) noch mehr.
  • Semikolons (;) werden auf vielen Systemen zum Trennen von Befehlen verwendet. Semikolons und Kommas (,) werden verwendet, um Befehlszeilenargumente in (einigen Versionen von?) Der Windows-Befehlszeile zu trennen .
  • []()^ #%&!@:+={}'~und [`] alle haben in vielen Schalen eine besondere Bedeutung und sind ärgerlich, wenn man sie umgeht, und sollten daher vermieden werden. Sie sehen auch in URLs schrecklich aus .
  • Zu vermeidende Hauptfiguren :
    • Viele Befehlszeilenprogramme verwenden den Bindestrich [-] , um spezielle Argumente anzugeben.
    • * Auf nix-basierten Systemen wird ein Punkt [.] als führendes Zeichen für versteckte Dateien und Verzeichnisse verwendet.
  • Alles, was nicht im ASCII-Satz enthalten ist, kann auf älteren oder grundlegenderen Systemen (z. B. einigen eingebetteten Systemen) Probleme verursachen und sollte mit Vorsicht verwendet werden.

Das lässt Sie im Grunde mit:

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

das ist immer sicher und nicht ärgerlich zu benutzen (solange du den Dateinamen mit einer alphanumerischen Zahl beginnst) :)

naught101
quelle
1
Die Klammern ( []) sind Teil regulärer Ausdrücke und haben auch in der Shell eine besondere Bedeutung. Aber es ist nicht so schlimm, mit ihnen zu arbeiten, außer mit einigen bösen Eckfällen.
Martin Ueding
1
Hrm ... ich denke, dasselbe könnte man ()eigentlich sagen .
Naught101
4
In zsh können Zeichen unterschiedlich interpretiert werden []()^;, daher denke ich, dass die richtige Antwort tatsächlich [0-9a-zA-Z.,_-]Komma sein könnte, und möglicherweise auch ausgeschlossen werden kann, nur weil es seltsam ist, in einem Dateinamen zu sehen, obwohl ich mir keinen konkreten Fall vorstellen kann, in dem dies dazu führen würde Probleme.
Casey Rodarmor
Ja, ich habe sie von der endgültigen Liste entfernt
naught101
1
Komma kann ärgerlich sein, versuchen Sie es echo whereami > a,b,cin Win10 Eingabeaufforderungsfenster.
RedGrittyBrick
4

Du könntest:

  1. Ersetzen Sie aktuelle Unterstriche durch #(Korrekturlesersymbol für Leerzeichen).
  2. Unterstreichen Sie das 'Abschnitts'-Datum vom Dateinamen (oder einem zweiten Bindestrich - einfacher einzugeben)

Alt-1. Initialen können Leerzeichen ersetzen: YYMMDD-HHMM-FileName.extoderYYMMDD-HHMM_FileName.ext

Minimale Zeichen für eine übersichtliche Anzeige, die automatisch mit gepolsterten Nullen für Jan-Sep (& 1st-9th ea mo) sortiert.

tb01
quelle