it-swarm.com.de

Ist in einem Dateinamen kein Speicherplatz zulässig?

Es wird gesagt, dass Sie unter Unix und Linux generell vermeiden sollten, Leerzeichen in einem Dateinamen einer Datei zu haben (normale Datei, Verzeichnis, Link, Gerätedatei, ...).

Aber das mache ich die ganze Zeit. Für einen Dateinamen mit einem Leerzeichen im Inneren,

  • In Nautilus wird das Leerzeichen als Leerzeichen angezeigt.
  • Im Bash-Terminal verwende ich entweder \, Um ein Leerzeichen darzustellen, oder füge den Dateinamen in doppelte Anführungszeichen ein.
  • in den Dateien einiger Anwendungen (Nautilus, nicht sicher, ob das Betriebssystem dies auch tut) wird der Dateiname so geschrieben, dass das Leerzeichen durch %20 ersetzt wird.

Ist ein Leerzeichen in einem Dateinamen wirklich nicht erlaubt?

Wie verwenden oder behandeln Sie ein Leerzeichen in einem Dateinamen richtig?

32
Tim

Leerzeichen und in der Tat jedes Zeichen außer / und NUL sind in Dateinamen zulässig. Die Empfehlung, nicht Leerzeichen in Dateinamen zu verwenden, besteht in der Gefahr, dass sie von Software, die sie schlecht unterstützt, falsch interpretiert werden. Diese Software ist wohl fehlerhaft. Aber auch Programmiersprachen wie Shell-Skripte machen es allzu einfach, Software zu schreiben, die bei Dateinamen mit Leerzeichen kaputt geht, und diese Fehler treten häufig auf, da Shell-Skripte von ihren Entwicklern nicht oft mit Dateinamen mit Leerzeichen getestet werden Sie.

Leerzeichen ersetzt durch %20 wird in Dateinamen nicht oft gesehen. Dies wird hauptsächlich für (Web-) URLs verwendet. Obwohl es stimmt, dass% -Ecoding von URLs manchmal in Dateinamen gelangt, oft aus Versehen.

49
Celada

Leerzeichen sind in Dateinamen zulässig, wie Sie beobachtet haben.

Wenn Sie sich den Eintrag "Die meisten UNIX-Dateisysteme" in dieses Diagramm in Wikipedia ansehen, werden Sie Folgendes feststellen:

  • Jeder 8-Bit-Zeichensatz ist zulässig. Wir können 7-Bit ASCII auch unter diesem Dach 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.

Wenn Sie jedoch die Shell verwenden, werden Sie möglicherweise feststellen, dass es einige Zeichen gibt, die Ärger verursachen, vor allem *, bei dem es sich um einen POSIX-Globbing-Operator handelt.

Abhängig davon, wie Sie "Ärger" definieren möchten, fügen Sie könnte Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche usw.) ein, da dies das Zitieren mit "". Dies ist jedoch unvermeidlich, da Leerzeichen zulässig sind.

Wie verwenden oder behandeln Sie ein Leerzeichen in einem Dateinamen richtig?

Umschließen Sie in einem Shell-/Befehlszeilenkontext den Dateinamen in einfache oder doppelte Anführungszeichen (beachten Sie jedoch sie sind nicht gleich WRT andere Probleme) oder schließen Sie die Leerzeichen mit \, Z.

> foo my\ file\ with\ spaces\ in\ the\ name
17
goldilocks

Der Grund ist größtenteils historisch - WEGE im Nebel der Zeiträume waren in Dateinamen nicht zulässig, daher wurden Leerzeichen als Schlüsselwort-/Dateinamen-Trennzeichen verwendet. Zukünftige Shell-Interpreter mussten mit alten Skripten umgekehrt kompatibel sein, und daher bleiben wir bei den Kopfschmerzen, die wir heute haben.

Entwickler von Prozessen, die sich nicht sehr viel mit Menschen befassen müssen, können die Dinge viel, viel einfacher machen, indem sie Leerzeichen ganz löschen. Apple tut dies, der Inhalt von/System/Library/CoreServices/enthält nur 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 tun kann" -> "Verwenden Sie 12 Zeichen in einem Dateinamen." -> Stille. Leerzeichen waren auch in diesen 12 Zeichen möglich)

3
paul

Also ja, wie schon oft an anderer Stelle erwähnt, kann ein Dateiname fast jedes Zeichen enthalten. Aber es muss gesagt werden, dass ein Dateinamenicht eine Datei ist. Es hat etwas Gewicht als Datei Attribut, da Sie normalerweise einen Dateinamen benötigen, um öffnen eine Datei, aber ein Dateiname nur Punkte zur eigentlichen Datei. Es handelt sich um einen Link, der in dem Verzeichnis gespeichert ist, in dem er aufgezeichnet wurde, zusammen mit Inode-Nummer - was einer tatsächlichen Datei viel näher kommt.

Also, wissen Sie, nennen Sie es wie Sie wollen. Dem Kernel ist das egal - alle Dateiverweise, die er verarbeitet, behandeln sowieso echte Inode-Nummern. Der Dateiname ist eine Sache für menschlichen Konsum - 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 nur mit Leerzeichen. Jeder Dateiname enthält ein Leerzeichen mehr als das letzte:

until [ $((i=$i+1)) -gt 20 ]
do  v=$v' ' && touch ./"$v"
done

Das ist irgendwie lustig. Schau dir mein ls an:

ls -d ./*
./      ./          ./              ./                  ./                 
./      ./          ./              ./                  ./                  
./      ./          ./              ./                  ./                   
./      ./          ./              ./                  ./     

Jetzt werde ich dieses Verzeichnis spiegeln:

set -- * ; mkdir ../mirror
ls -i1qdU -- "[email protected]" |
sh -c 'while read inum na
    do  ln -T "$1" ../mirror/$inum
    shift ; done' -- "[email protected]"
ls -d ../mirror/*

Hier sind ../mirror/ 's Inhalt:

../mirror/423759  ../mirror/423764  ../mirror/423769  ../mirror/423774
../mirror/423760  ../mirror/423765  ../mirror/423770  ../mirror/423775
../mirror/423761  ../mirror/423766  ../mirror/423771  ../mirror/423776
../mirror/423762  ../mirror/423767  ../mirror/423772  ../mirror/423777
../mirror/423763  ../mirror/423768  ../mirror/423773  ../mirror/423778

Ok, aber vielleicht fragst du - aber was nützt das? Wie können Sie erkennen, welche welche ist? Wie können Sie überhaupt sicher sein, dass Sie die richtige Inode-Nummer mit dem richtigen Dateinamen verknüpft haben?

Gut...

echo "heyhey" >>./'    ' 
tgt=$(ls -id ./'    ')
cat ../mirror/${tgt%% .*} \
    $(ls -1td ../mirror/* | head -n1) 

AUSGABE

heyhey
heyhey

Siehe sowohl die Inode-Nummer in ../mirror/"${tgt%% .*}" und das von ./' ' verweisen auf dieselbe Datei. Sie beschreiben dieselbe Datei. Sie nennen es, aber nichts weiter. Es gibt eigentlich kein Rätsel, nur einige Unannehmlichkeiten, die Sie sich selbst machen könnten, die aber letztendlich kaum oder gar keine Auswirkungen auf den Betrieb Ihres Unix-Dateisystems haben werden.

2
mikeserv