Es heißt, dass Sie unter Unix und Linux generell vermeiden sollten, Leerzeichen in einem Dateinamen zu haben (normale Datei, Verzeichnis, Link, Gerätedatei, ...).
Aber das mache ich die ganze Zeit. Für einen Dateinamen mit einem Leerzeichen
- In Nautilus wird das Leerzeichen als Leerzeichen angezeigt.
- Im Bash-Terminal
\
stelle ich entweder ein Leerzeichen dar oder setze den Dateinamen in doppelte Anführungszeichen. - In einigen Anwendungsdateien (Nautilus, nicht sicher, ob das Betriebssystem dies auch tut) wird der Dateiname mit dem durch ersetzten Leerzeichen geschrieben
%20
.
Ist ein Leerzeichen in einem Dateinamen wirklich nicht erlaubt?
Wie wird ein Leerzeichen in einem Dateinamen richtig verwendet oder behandelt?
-rf ~
(usetouch -- "-rf ~"
) erstellen , ich würde es jedoch nicht empfehlen./
Trennzeichen). Die Verwendung aller 254 verbleibenden Bytes öffnet die Tür zu allen Arten von unsagbaren eldritch "Namen". Offensichtlich ist das verrückt, aber nicht jeder ist sich einig, was "gesund" ist, und verschiedene Charaktere werden verschiedene Werkzeuge zerstören. Der Schnittpunkt aller Menschen ist ziemlich klein .Antworten:
Leerzeichen und in der Tat alle Zeichen außer
/
und NUL sind in Dateinamen zulässig. Die Empfehlung, keine Leerzeichen in Dateinamen zu verwenden, beruht auf der Gefahr, dass sie von Software, die sie schlecht unterstützt, falsch interpretiert werden. Wahrscheinlich ist eine solche Software fehlerhaft. Aber auch Programmiersprachen wie Shell-Skripte machen es allzu einfach, Software zu schreiben, die bei der Darstellung von Dateinamen mit Leerzeichen abbricht. Diese Fehler treten häufig auf, weil Shell-Skripte von ihren Entwicklern nicht oft mit Dateinamen mit Leerzeichen getestet werden Sie.Leerzeichen, die durch ersetzt werden
%20
, werden in Dateinamen nicht häufig verwendet. Dies wird hauptsächlich für (Web-) URLs verwendet. Obwohl es wahr ist, dass% -Verschlüsselung von URLs manchmal in Dateinamen gelangt, oft aus Versehen.quelle
bash
. Ich habe ein paar Dinge ausprobiert, wie das Zitieren mit Strg-V und so,$(echo -e \\0)
aber es hat nicht funktioniert. Der Grund, warum NUL nicht in Dateinamen verwendet werden kann, ist, dass es nicht in C-Strings verwendet werden kann (da es sich um den String-Terminator handelt) und alle zugrunde liegenden APIs sowie praktisch alle von C-Programmen verarbeiteten Strings dieses Format verwenden . Dabash
es in C geschrieben ist, hat es möglicherweise überhaupt keine Unterstützung für Zeichenfolgen, in denen NUL enthalten ist. Ich könnte mich irren, es könnte einen undurchsichtigen Weg geben ...NUL
und bash, das brauchst du$'\0'
. Zum Beispiel:find . -print0 | while read -d $'\0' f; do echo "$f"; done
Leerzeichen sind in Dateinamen erlaubt, wie Sie gesehen haben.
Wenn Sie sich den Eintrag "Die meisten UNIX-Dateisysteme" in diesem Diagramm in Wikipedia ansehen , werden Sie feststellen:
Jeder 8-Bit-Zeichensatz ist zulässig. Wir können unter diesem Dach auch 7-Bit-ASCII subsumieren, da es sich um eine Teilmenge verschiedener 8-Bit-Mengen handelt und immer mit 8-Bit-Bytes implementiert wird.
Die einzigen verbotenen Zeichen sind
/
und "null". "Null" bezieht sich auf ein Null-Byte, diese sind jedoch in Textdaten ohnehin nicht zulässig.Allerdings , wenn Sie keine Nutzung der Schale machen, merkt man kann, dass es einige Zeichen, die einen stress schaffen, was am wichtigsten
*
, die ein POSIX Globbing Operator ist.Je nachdem , wie Sie wollen „Ärger“ definieren, Sie könnten umfassen Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche usw.) gibt, da dies die Notwendigkeit schafft mit für zitiert
""
. Aber das ist unvermeidlich, da Leerzeichen erlaubt sind, also ...Schließen Sie in einem Shell- / Befehlszeilenkontext den Dateinamen in einfache oder doppelte Anführungszeichen (beachten Sie jedoch, dass dies nicht dasselbe WRT-Problem ist wie in anderen Fällen) oder schließen Sie die Leerzeichen mit den folgenden
\
Zeichen ab:quelle
touch $(echo -e "foo\00bar")
--e
Prozesse\0N
als Oktalwert, aber sie gehen trotzdem irgendwo verloren, da nur eine Datei namens erstellt wirdfoobar
. Natürlich kann NULL nicht gedruckt werden, aber ich garantiere, dass es aufgrund der C-String-Einschränkung von dort weg ist.foo[NULL]bar
würde wiefoo
für die meisten Absichten und Zwecke enden . Die Tatsache, dass dies nicht der Fall ist,echo -e
zeigt , dass der NULL-Wert irgendwo gestrichen wurde./
ist das Verzeichnistrennzeichen und kann nicht in Anführungszeichen gesetzt werden, kann also in einem Pfadnamen stehen) aber nicht in einem Dateinamen).Der Grund ist größtenteils historischer Natur. Damals waren Leerzeichen in Dateinamen nicht zulässig, daher wurden Leerzeichen als Trennzeichen zwischen Schlüsselwörtern und Dateinamen verwendet. Zukünftige Shell-Interpreter mussten mit alten Skripten kompatibel sein, und daher stecken wir bei den heutigen Kopfschmerzen fest.
Entwickler von Prozessen, die sich nicht sehr mit Menschen auseinandersetzen müssen, können die Dinge sehr viel einfacher machen, indem sie Leerzeichen ganz weglassen. Apple tut dies, der Inhalt von / System / Library / CoreServices / enthält sehr wenige Leerzeichen, die Programme mit Leerzeichen werden im Auftrag des Benutzers geöffnet und WouldLookStrangeIfCamelCased. Ähnliche Nur-Unix-Pfade vermeiden auch Leerzeichen.
(etwas verwandte Anekdote: Mitte der 90er Jahre sagte eine Windows-Drohne: "Nennen Sie eine Sache, die Sie auf einem Mac tun können, die ich unter Windows nicht kann" -> "Verwenden Sie 12 Zeichen in einem Dateinamen." -> Stille. Leerzeichen waren auch in diesen 12 Zeichen möglich)
quelle
Also ja, wie oft an anderer Stelle angegeben, kann ein Dateiname fast jedes Zeichen enthalten. Aber es muss gesagt werden , dass ein Dateiname ist nicht eine Datei. Es hat einiges Gewicht als Datei trägt Attribut , dass Sie in der Regel einen Dateinamen müssen öffnen eine Datei, sondern eine Name der Datei nur verweist auf die eigentliche Datei. Hierbei handelt es sich um eine Verknüpfung, die in dem Verzeichnis gespeichert ist, in dem sie gespeichert wurde, zusammen mit der Inode-Nummer - eine viel engere Annäherung an eine tatsächliche Datei .
Nennen Sie es also, wie Sie wollen. Der Kernel kümmert sich nicht darum - alle Dateireferenzen, die er verarbeiten wird, werden sowieso mit realen Inode-Nummern umgehen. Der Dateiname ist eine Sache für den menschlichen Verzehr - wenn Sie es zu einer verrückten Sache machen wollen, dann ist es Ihr Dateisystem. Hier mache ich ein paar verrückte Sachen:
Zuerst erstelle ich 20 Dateien und benenne sie mit Leerzeichen. Jeder Dateiname enthält ein Leerzeichen mehr als der letzte:
Das ist irgendwie lustig. Schau dir meine an
ls
:Jetzt werde ich dieses Verzeichnis spiegeln:
Hier sind
../mirror/
die Inhalte:Ok, aber vielleicht fragst du - aber was nützt das? Woran erkennt man was was ist? Wie können Sie sogar sicher sein, dass Sie die richtige Inode-Nummer mit dem richtigen Dateinamen verknüpft haben?
Gut...
AUSGABE
Siehe, sowohl die in enthaltene
../mirror/"${tgt%% .*}"
als auch die mit referenzierte Inode-Nummer./' '
beziehen sich auf dieselbe Datei. Sie beschreiben die gleiche Datei. Sie nennen es, aber nichts weiter. Eigentlich gibt es kein Rätsel, nur einige Unannehmlichkeiten, die Sie sich möglicherweise selbst machen, die sich aber letztendlich kaum oder gar nicht auf den Betrieb Ihres Unix-Dateisystems auswirken werden.quelle