Warum erlaubt Unix Dateien mit einem Punkt am Ende des Namens? Gibt es eine Verwendung dafür?
Zum Beispiel:
filename.
Ich frage, weil ich eine einfache Funktion habe, die die Erweiterung einer Datei wiedergibt.
ext() {
echo ${1##*.}
}
Da ich jedoch wusste, dass nichts gedruckt wird, wenn der Dateiname mit a endet .
, fragte ich mich, ob das Schreiben zuverlässiger wäre:
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
Dies hängt natürlich davon ab, was Sie erreichen .
möchten , aber wenn ein am Ende des Dateinamens nicht zulässig wäre, hätte ich mich überhaupt nicht gefragt.
example.tar.gz
angeben, werden alle Suffixe ab dem ersten Punkt entfernt, wodurch nicht die einzige Erweiterung erhalten wird, die zum Aufrufen des richtigen Programms für die Verarbeitung erforderlich ist. Wenn Ihr Dateiname keine (durch Punkte getrennte) "Erweiterung (en)" hat, druckt Ihre Funktion den gesamten eingegebenen Namen. In diesem Fall benötigen Sie einen zusätzlichen Test, um eine leere Zeichenfolge zurückzugeben..
.Antworten:
Unix-Dateinamen sind nur Folgen von Bytes und können jedes Byte außer
/
undNUL
an jeder Position enthalten. Es gibt kein eingebautes Konzept für eine "Erweiterung" wie in Windows und seinen Dateisystemen, und daher gibt es keinen Grund, Dateinamen nicht mit einem Zeichen enden (oder beginnen) zu lassen, das allgemein in ihnen vorkommen kann - a.
ist nichts Besonderes als einx
.Warum erlaubt Unix Dateien mit einem Punkt am Ende des Namens? "Eine Folge von Bytes" ist eine einfache und nicht ausschließende Definition eines Namens, wenn es keinen motivierenden Grund gibt, etwas zu zählen, was es nicht gab. Eine Regel zu erstellen und anzuwenden, um etwas spezifisch auszuschließen, ist mehr Arbeit.
Gibt es eine Verwendung dafür? Wenn Sie eine Datei mit diesem Namen erstellen möchten, stellen Sie sicher. Gibt es eine Verwendung für einen Dateinamen, der mit endet
x
? Ich kann nicht sagen, dass ich im Allgemeinen einen Dateinamen mit einem.
am Ende erstellen würde , aber beide.
undx
sind explizit Teil des Zeichensatzes für tragbare Dateinamen , der universell unterstützt werden muss, und keiner ist in irgendeiner Weise speziell, wenn ich also einen hätte Verwenden Sie es (vielleicht für eine mechanisch erzeugte Codierung), dann könnte ich und ich könnte mich darauf verlassen, dass es funktioniert.Auch die besonderen Dateinamen
.
(dot) und..
(Punkt-Punkt), die auf die aktuellen und die übergeordneten Verzeichnisse verweisen, sind vorgeschrieben durch POSIX, und beide Ende mit einem.
. Jeder Code, der sich im Allgemeinen mit Dateinamen befasst, muss diese ohnehin adressieren.quelle
Die eigentliche Frage ist, warum Betriebssysteme in '.' ? Es gibt keinen technischen Grund dafür, es ist nur ein Standard, mit dem Sie den Dateityp ohne Überprüfung annehmen können.
Wenn Sie eine MP3-Datei in .txt umbenennen und versuchen, sie in Windows zu öffnen, werden Sie sofort erkennen, warum diese Idee Nachteile hat: Sie können die Datei plötzlich nicht mehr richtig öffnen. Technisch gesehen besteht der "beste" Weg ohne Geschwindigkeitsüberlegungen usw. wahrscheinlich darin, den Dateityp zu bestimmen, bevor entschieden wird, was damit zu tun ist, da Erweiterungen leicht gefummelt werden und Probleme verursachen können.
Der Grund, warum Linux sich nicht für einen Punkt im Namen interessiert, ist der gleiche Grund, warum eine Nicht-Computer-Person dies nicht tut: Es gibt keinen inhärenten Unterschied zwischen einem Punkt und einem anderen Zeichen außer der Tatsache, dass einige Programme zufällig codiert sind, um sie zu sehen diese Zeit und behandeln Sie es speziell.
Angenommen, Sie möchten tatsächlich nur die Erweiterung (was nicht bei beiden Snippets der Fall ist), könnten Sie Folgendes verwenden:
* Beachten Sie den letzten.
Wenn Sie den Dateinamen selbst zurückgeben möchten, wenn keine Erweiterung vorhanden ist, wie dies bei Ihrem Code der Fall ist, gibt es keinen Grund, das lange zweite Snippet im SH-Stil zu verwenden. Du hast geschrieben:
Welches ist eigentlich nur:
Welches ist eigentlich nur:
Sie können nichts für selbstverständlich halten, was Benutzer grundsätzlich eingeben können. Wenn Sie sehen möchten, um welche Art von Datei es sich tatsächlich handelt, versuchen Sie den Befehl file. Da das Parsen von Dateinamen, um den Dateityp herauszufinden, nicht die einzige Möglichkeit ist, diese Katze zu häuten. Sie können unter Linux sogar einen Dateinamen namens einfach haben: \
quelle
echo ${1##*.}
kümmert sich nur um Punkte, und wenn Punkte am Ende eines Dateinamens nicht zulässig wären, müsste ich nicht über den Sonderfall eines Zeitraums nachdenken, der einen Dateinamen beendet..
..
", weil die Verwendung als Trennzeichen für eine Erweiterung eine gängige Konvention ist und viele Skripte unter dieser Annahme geschrieben werden.