Ist es richtig, bestimmte Sonderzeichen beim Benennen von Dateinamen unter Linux zu verwenden?

18

Ist es richtig , bestimmte Sonderzeichen zu verwenden, wie +, &, ', .(Punkt) und ,(Komma), im Grunde, in Dateinamen.

Ich verstehe, dass Sie -und _ohne Probleme verwenden können, aber bei einigen Nachforschungen konnte ich nichts Bestimmtes über die anderen Symbole finden. Einige sagen, dass Sie es können, andere sagen, dass Sie es nicht können, und andere sagen, dass es "nicht ermutigt" ist, sie zu verwenden (was auch immer das bedeutet).

Chris Klein
quelle
Mit welchen Programmen arbeiten Sie mit diesen Dateien? Nur Programme, die bestimmte Zeichen auf besondere Weise interpretieren (z. B. Shells auf nicht zitierten Zeichenfolgen), führen zu Problemen. Ein durchschnittliches C-Programm benötigt alles, was nicht NUL ist, ohne ein Auge zu blinzeln.
Anthon
9
Was meinst du mit "richtig"?
David Richerby
Das Problem bei der Verwendung von Sonderzeichen in einem Dateinamen besteht darin, dass dadurch die Wahrscheinlichkeit erhöht wird, dass fehlerhafter Code den Dateinamen falsch handhabt. Ich glaube jedoch nicht, dass die von Ihnen aufgelisteten Charaktere besonders wahrscheinlich Probleme verursachen. Sie würden mehr Probleme mit Leerzeichen haben, die im Allgemeinen vermieden werden sollten . Und EOL sollte um jeden Preis vermieden werden.
Windows unterliegt strengeren Einschränkungen hinsichtlich der möglichen Elemente in einem Dateinamen. Wenn also die Möglichkeit besteht, dass die Dateien dort verwendet werden müssen, sollten Sie dies beachten.
Übelsuppe

Antworten:

28

Ist es richtig, bestimmte Sonderzeichen wie +, &, ',. (Punkt) und (Komma) im Grunde genommen in Dateinamen.

Ja.

Richtig, aber nicht unbedingt ratsam oder praktisch.

Sie können in modernen Unix- und Linux-Dateisystemen beliebige Zeichen außer null und/ innerhalb eines Dateinamens verwenden.

Sie können ASCII-Interpunktion verwenden . Einige Dienstprogramme verwenden Stopps ( Punkte ) und Kommas in den Namen der von ihnen erstellten Dateien.

Sie können ASCII-Steuerzeichen verwenden , dies ist jedoch nicht ratsam, da es unwahrscheinlich ist, dass sie akzeptabel angezeigt werden und schwierig zu verwenden sind.

Sie können Shell- Metazeichen wie ASCII-Et-Zeichen und ASCII-Apostroph verwenden. Dies ist jedoch unpraktisch und erfordert, dass Sie beim Erstellen von Befehlen besonders darauf achten, solche Zeichen in Anführungszeichen zu setzen oder zu maskieren.

Sie können Multi-Byte-Zeichen mit einer Vielzahl von Codierungen verwenden. Es liegt an der Shell und / oder den Dienstprogrammen, Nicht-ASCII-Zeichen richtig zu interpretieren und anzuzeigen. Es ist ratsam, sich auf eine gängige Codierung wie UTF-8 zu beschränken und das Gebietsschema entsprechend festzulegen.

Bei der Verwendung von druckbaren ASCII-Zeichen treten die wenigsten Probleme auf. Sie beschränken den Satz von Interpunktionszeichen auf Zeichen, die keine Shell-Metazeichen sind, und beginnen einen Namen nicht mit einem Bindestrich (oder einem Stopp - es sei denn, Sie möchten die Datei ausblenden).

RedGrittyBrick
quelle
23

Wie bereits erwähnt, können auf modernen Unix / Linux-Systemen Dateinamen mit Ausnahme von \0(NUL) und /(Schrägstrich) beliebige Zeichen enthalten .

Darüber hinaus definiert der POSIX-Standard einen portablen Zeichensatz für Dateinamen:

3.278 Zeichensatz für tragbare Dateinamen

Der Zeichensatz, aus dem tragbare Dateinamen erstellt werden.

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

Die letzten drei Zeichen sind die Zeichen <Punkt>, <Unterstrich> und <Bindestrich>. Siehe auch Pfadname .

Das pathchkDienstprogramm von GNU Coreutils prüft dies, wenn es mit der -pOption aufgerufen wird , und die -POption warnt vor leeren Dateinamen (die nicht gültig sind, aber als Argument an übergeben werden können pathchk) und Dateinamen, die mit einem Bindestrich ( -) beginnen.

nyuszika7h
quelle
9

Am sichersten ist es, den für ein Betriebssystem zulässigen Zeichensatz im Wikipedia-Eintrag zu finden. Es kann von hier aus gefunden werden .

Beispielsweise ist für die meisten Unix-basierten Systeme der zulässige Zeichensatz ein 8-Bit-Satz, und das reservierte Zeichen ist das Nullzeichen (NUL, '\0'). Es ist jedoch nicht ratsam, die Sonderzeichen in den Dateinamen zu verwenden, da sie beim Entfernen ein Problem darstellen.

Zum Beispiel kann ich einen Dateinamen als haben -ramesh.txtund ich versuche, ihn wie folgt zu entfernen.

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.

Ich muss die Datei löschen als,

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

Weitere Details finden Sie auch in dieser Antwort .

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.

Zusammenfassend lässt sich sagen, dass das Problem nicht darin besteht, die Sonderzeichen für Dateinamen zu verwenden, sondern darin, wie damit umzugehen ist.

Ramesh
quelle
Aus diesem Grund ("wie man damit umgeht") verwende ich fast ausschließlich Buchstaben, Zahlen, Unterstriche und Punkte, um mir das Leben zu erleichtern, wenn ich später beschließe, Befehlszeilenprogramme zu verwenden, um meine Dateien zu bearbeiten (was anscheinend immer mindestens einmal auftaucht).
Phyrfox
19
Nicht zu befürworten Dateinamen beginnen mit , -aber nur um genau zu sein: 1) : Sie müssen nicht die Anführungszeichen um diesen Dateinamen, 2) anstelle der besonderen verwenden --Argument können Sie genau das tun , was rmsich schon sagt: rm ./-ramesh.txt, also Sie nicht brauchen , es zu tun genau wie du vorschlägst.
Michał Politowski
@ MichałPolitowski Du brauchst nicht nur die Zitate, sie haben genau null Wirkung.
Strg-Alt-Delor
4

Ihre Forschung ist fast richtig. Es ist möglich, Sonderzeichen in Dateinamen zu verwenden, dies ist jedoch nicht ratsam, da diese Zeichen eine besondere Bedeutung haben. Konventionen für die Benennung von Dateien in Linux beschreiben andere Einschränkungen für Dateinamen, z. B. "Dateinamen sollten niemals mit einem Bindestrich beginnen."

Einfaches Beispiel für die Ausführung von Befehlszeilenoperationen mit Sonderzeichen in Dateinamen.

Persönlich möchte ich lieber Sonderzeichen in Dateinamen vermeiden, da diese besondere Aufmerksamkeit erfordern, wenn diese Dateien für die Verarbeitung verwendet werden. Damit entfällt die Sorge um den Umgang mit Sonderzeichen aus dem Entwicklungsprozess.

Einfach ich
quelle
1
So Ihre beraten wäre nur zu verwenden -, _und .(dot) in Dateinamen?
Chris Klein
@ ChrisKlein, yep, aber nicht am Anfang des Dateinamens.
Simply_Me
Besondere Bedeutung hat das Programm (zB Ihre Shell), nicht der Dateiname. Fast alle Programme auf U & L kümmern sich nicht um Zeichen überhaupt , solange es kein NUL im Dateinamen ist.
Anthon
@Anthon, ja, meine Shell wie im Link beschrieben.
Simply_Me
2
Als persönliche Anmerkung empfehle ich Entwicklern, den übergeordneten Ordner ihres Projekts mit "föλder \ t☃" zu benennen, damit sie sofort bemerken, wenn sie einen Fehler machen, der bei solchen Dateinamen bricht, anstatt fehlerhaften Code oder Binärdateien zu veröffentlichen dass andere arbeiten müssen. Die Verwendung ist kein Problem, solange es das einzige ist, das mit 'f' beginnt, wird die Tabulatorvervollständigung in jeder Shell das schwer zu tippende Zeug eingeben.
Peteris