Namenskonvention für Unix-Dateien [geschlossen]

61

Ich habe mich gefragt, wie die Benennungskonvention für Dateien in Unix lautet. Ich bin mir nicht sicher, aber ich denke, es gibt vielleicht eine universelle Namenskonvention, der man folgen sollte?

Zum Beispiel möchte ich eine Datei so benennen: backupmit part 2undrandom

Soll ich das so machen:

backup_part2_random

ODER

backup-part2-random

ODER

backup.part2.random

Ich hoffe die Frage ist klar. Grundsätzlich möchte ich ein Format wählen, das der Unix-Philosophie entspricht.

slm
quelle
4
Als allgemeine Bemerkung zu den "Konventionen" ... Ich habe gerade alle Antworten gelesen und es ist mir aufgefallen, wie seltsam es ist, dass es fast eine Obszönität ist, nur einen Fall in einem System zu verwenden, in dem (glaube ich) eine seiner Stärken ist die Fähigkeit , beide Fälle sinnvoll zu nutzen ... War das ursprüngliche Design (case-sensitive) ein Over - Design) ... nur sinnend
Peter.O
Meiner Meinung nach gibt es keine Konvention. Dateinamen sind nur Zeichenfolgen. Wählen Sie Ihren Lieblingsstil.
Glenn Jackman
1
Das liegt daran, dass sich niemand an die Großschreibung von Befehlen erinnern möchte, also verwenden sie alle dasselbe.
LtWorf

Antworten:

57

.wird verwendet, um eine Dateierweiterung zu trennen, z foo.txt.

-oder _wird verwendet, um logische Wörter zu trennen, z . B. my-big-file.txtoder manchmal my_big_file.txt. -ist besser, weil Sie nicht die Umschalttaste drücken müssen (zumindest bei einer Standard-PC-Tastatur in US-Englisch), andere bevorzugen es, _weil es eher wie ein Leerzeichen aussieht.

Also, wenn ich Ihr Beispiel verstehe, backup-part2-randomoder backup_part2_randomder normalen Unix-Konvention am nächsten wäre.


CamelCase wird normalerweise nicht auf Linux / Unix-Systemen verwendet. Schauen Sie sich die Dateinamen in /binund an /usr/bin. CamelCase ist auf Unix- und Linux-Systemen eher die Ausnahme als die Regel.

( NetworkManagerDas einzige Beispiel, an das ich denken kann, ist CamelCase. Es wurde von einem Mac-Entwickler geschrieben. Viele haben sich über diese Namenswahl beschwert. Unter Ubuntu haben sie das Skript tatsächlich in umbenannt network-manager.)

Zum Beispiel /usr/binauf meinem System:

$ ls -d [A-Z]* | wc -w    # files starting with a capital
6
$ ls -d *_* | wc -w       # files containing an underscore
178
$ ls -d *-* | wc -w       # files containing a minus/dash
409

und selbst dann verwendet keine der Dateien, die mit einem Großbuchstaben beginnen, CamelCase:

$ ls -d [A-Z]*
GET  HEAD  POST  X11  Xvnc  Xvnc4
Mikel
quelle
Das .Zeichen kann auch verwendet werden, um Dinge zu drehen, und nicht nur, um eine Erweiterung anzugeben. Zum Beispiel my.log my.log.1 my.log.2.gz.
Depado
Der Bindestrich / Minus / Bindestrich ist also häufiger als der Unterstrich.
Hugo
@ Hugo Ja. Das oben gezeigte zeigt Minus (409) gegen Unterstrich (178).
Mikel
Vielen Dank. Haben Sie Referenzen für diese Konventionen?
Proletariat
3
+1 für die Referenzen. (@Proletariat, die lsAusgabe von /usr/bin ist eine Referenz. Dies ist eine Frage zu Konventionen. )
Wildcard
35

Viel wichtiger ist, dass eine bestimmte Konvention konsistent ist. Wähle einen Stil und bleibe dabei.

David Oneill
quelle
19

Meine Einstellung zu Unix / Linux-Dateinamenkonventionen:

  • Unix / Linux-Dateisysteme unterstützen den Begriff einer Erweiterung nicht von Natur aus. Das Konzept einer Dateierweiterung besteht vollständig als etwas von Dienstprogrammen wie unterstützt cp, lsoder die Shell Sie verwenden. Ich glaube, dass dies auch unter NTFS so ist, aber ich könnte mich irren.

  • Ausführbare Dateien, einschließlich Shell-Skripten, haben normalerweise keine Erweiterung. Skripte haben eine Hash-Bang-Zeile (dh #!/bin/bash), die angibt , welches Programm sie interpretieren soll.

  • Jede ausführbare Datei mit zwei Buchstaben ist sehr wichtig. Nennen Sie Ihre ausführbaren Dateien also nicht mit Dateinamen aus zwei Buchstaben. Jede Datei , in /etcder Endung tabist auch super wichtig, wie fstab, mtab, inittab.
  • Manchmal werden .dVerzeichnisnamen angehängt, insbesondere in /etc, aber dies ist nicht weit verbreitet (UPDATE: https://serverfault.com/questions/240181/what-does-the-suffix-d-mean-in-linux )
  • rcwird häufig für Konfigurationsskripte oder -dateien verwendet, entweder vor (z. B. rc.local) oder nach ( .vimrc)
  • Die Unix / Linux-Community hatte noch nie eine Beschränkung auf drei Zeichen für Erweiterungen und Stirnrunzeln, wenn bekannte Erweiterungen entsprechend gekürzt wurden. Verwenden Sie beispielsweise nicht .htmam Ende von HTML-Dateien unter Unix / Linux .html.
  • In einer Reihe von Dateien wird ein Dateiname manchmal in Großbuchstaben oder in Großbuchstaben angegeben, sodass er am Anfang einer Verzeichnisliste angezeigt wird. Das klassische Beispiel ist Makefilein Quellpaketen. Tun Sie dies nur für Dinge wie README.
  • ~wird verwendet, um eine Sicherungsdatei oder ein Verzeichnis wie in important_stuff~oder zu identifizieren /etc~. Viele Shells wird ein einsames erweitern ~zu $HOME.
  • Bibliotheksdateien beginnen fast immer mit lib. Ausnahme ist zlibund wahrscheinlich ein paar andere.
  • Skripte, die von inetd aufgerufen werden, sind manchmal mit einem führenden Code versehen in., z in.tftpd.
  • Die Endung z in vmlinuzbedeutet gezippt, aber ich habe noch nie eine andere Datei mit diesem Namen gesehen.
LawrenceC
quelle
2
Ich sehe oft Shell-Skripte mit einer .sh"Erweiterung". Ich persönlich finde es etwas ärgerlich, aber ich muss zugeben, dass ich einen guten Grund für die Verwendung des nicht kenne .sh.
Dan Moulding
4
Es fällt mir ein, dass es nützlich ist, die Tatsache hervorzuheben, dass es sich um ein textbasiertes Skript und nicht um ein Binärskript handelt.
LawrenceC
1
Ich persönlich verwende @DanMoulding .shfür Skripte, die (1) nicht interaktiv ausgeführt werden sollen, sondern nur aus anderen Skripten / Programmen oder (2) eher für die Beschaffung als für die Ausführung bestimmt sind. Für die ersteren müssen sie ausführbar sein; für letztere lasse ich das ausführbare Bit weg und benutze die shebang-Zeile nur zur Dokumentation, für welche Shell die Funktionen geschrieben wurden.
Wildcard
3
@Wildcard Ich habe seit (vor 6 Jahren) die gleiche Angewohnheit bekommen. Die Erweiterung macht tatsächlich sehr viel Sinn für die Beschaffung von Skriptbits. Beispielsweise #!/bin/zshkönnen Sie anhand eines ausführbaren Skripts, das für zsh (dh oben) geschrieben wurde, sicher eine andere Datei mit der Erweiterung .zsh als Quelle angeben und sicherstellen, dass sie zulässigen zsh-Code enthält. Wenn Ihr ausführbares Skript ausschließlich Bourne Shell-kompatibel ist (dh #!/bin/shoben), dann wissen Sie, dass die Beschaffung dieser .zsh-Datei problematisch sein wird.
Dan Moulding
4
Ich finde es praktisch, ".sh", ".py", ".pl" usw. zu verwenden, und einige Texteditoren (z. B. Geany) verwenden diese, um einen ersten Eindruck vom richtigen Syntaxhervorhebungsschema zu erhalten.
BGVAUGHAN
7

In Unix ist Dateiname im Gegensatz zu DOS nur eine Zeichenfolge, bei der Dateiname aus Name und Erweiterung zusammengesetzt wurde. Jeder der angegebenen Dateinamen ist also völlig akzeptabel.

Viele Programme verwenden jedoch immer noch Dateisuffixe, die mit einem Punkt beginnen, um verschiedene Dateitypen zu unterscheiden. Apache Web Server verwendet also Suffixe, um den richtigen MIME-Typ in den Antwort-Headern festzulegen.

gelraen
quelle
5
Während gelraen zu 100% korrekt ist: Unix / Linux als solches kümmert sich nicht um Dateierweiterungen, aber moderne Linux-Versionen sind insofern von Bedeutung, als einige Shell-Erweiterungen eine spezielle Identifizierung (Farben oder andere) bestimmter Dateitypen bieten und Dateimanager automatische Verknüpfungen bereitstellen mit Programmen. Genauso wichtig ist es jedoch, dass der Benutzer weiß, welche Datei zu welchem ​​Typ gehört. Zu diesem Zweck ist es bequem, sich an ein Standardschema zu halten, das nicht nur für Sie selbst, sondern auch für andere gilt. In dieser Hinsicht sollten sich die Dinge nicht allzu sehr von MS Windows (oder MIME) unterscheiden.
Asoundmove
Das heißt, manchmal können mehrere verschiedene Erweiterungsstile dem gleichen Zweck entsprechen. Somit ist .tar.gz äquivalent zu .tgz, .tar.bz2 = .tbz, .ps.gz wird oft als .ps (verwirrend) abgekürzt und ich bin sicher, dass es noch viel mehr gibt.
Asoundmove
@asoundmove .ps.gz bedeutet, dass es sich um eine komprimierte .ps-Datei handelt. Genau wie .tar.gz bedeutet komprimierte .tar-Datei.
Jonescb
1
@ jonescb, ja natürlich. Mein Punkt, der verwirrend ist, ist, dass ich bei der Anzeige von .ps eine nicht komprimierte Datei erwarte (die ich in der Lage sein sollte, höchstens zu komprimieren), aber häufig werden .ps-Dateien komprimiert und sollten aus Gründen der Klarheit tatsächlich .ps.gz lauten ( wie sie benötigen zcat oder zless für die Quellcode-Anzeige). Einige Leute haben beschlossen, komprimierte PostScript-Dateien sowieso nur mit .ps zu versehen, weil es einigen gängigen ps-Viewern eigentlich egal ist, ob sie komprimiert sind oder nicht.
Asoundmove
6

Zwei Gedanken:

  1. Im Naming Variables, Functions, and FilesAbschnitt der GNU Coding Standards finden Sie:

    Bitte verwenden Sie Unterstriche, um Wörter in einem Namen zu trennen, damit die Emacs-Wortbefehle in ihnen nützlich sein können. Halten Sie sich an Kleinbuchstaben;

    Während IMO sagt "Sie sollten verwenden, _weil Emacs" scheint ein bisschen veraltet, ist es dennoch in ihrem "Standards" -Dokument.

  2. Nehmen wir für einen Moment an, dass wir uns alle einig sind, dass der Linux-Kernel das A und O * von Linux-Projekten ist und dass die dort verwendeten Konventionen als "Standard" -Konvention angesehen werden können.

    grepAls Quellcode für den Linux-Kernel finden Sie Folgendes:

    • In 44,6% der Fälle wird nur der Bindestrich verwendet
    • 54,1% der Zeit nur unterstreichen
    • In 1,2% der Fälle verwendet eine Datei beides.

Interessanterweise liegt die Quelle für Git bei 85% für Bindestriche, 3,8% für Unterstriche und 11,1% für beide.

Die Wahl ist klar, Debatte vorbei. ;)

Persönliche Meinung: Ich verwende Bindestriche aus ästhetischen und Shift-Key-Gründen. Wenn Sie in einem Team arbeiten, stimmen Sie ab. Aber um zu wiederholen, was gesagt wurde, sei konsequent .

* oder "be_all and end_all", wenn Sie möchten

Roy Truelove
quelle
4

Zeichen, die Sie nicht in Dateinamen verwenden sollten:

| ; ,! @ # $ () <> / \ "'` ~ {} [] = + & ^

Zeichenbegrenzer, die Sie verwenden sollten, um die Lesbarkeit von Namen zu verbessern:

_ -. :

(In einigen Fällen hat ":" jedoch eine besondere Bedeutung.)

Istvan
quelle
5
Natürlich können Sie nicht einmal "/" in Dateinamen verwenden. Alles andere ist möglich. Und wenn Sie es schwer machen wollen, auch nützlich ;-)
Jürgen A. Erhard
Die Liste ist tatsächlich viel länger, einschließlich Steuer- und Nicht-ASCII-Zeichen. Ja, Sie können ein Backspace als Teil eines * nix-Dateinamens verwenden.
20.
1
Genauer gesagt, die meisten * nix-Systeme verbieten nur zwei bestimmte Zeichen in Dateinamen: das /Pfadtrennzeichen und das Zeichenfolge-Abschlusszeichen \ 0 (ASCII-Null).
ein CVn
4

Um das zu ergänzen, was andere gesagt haben, würde ich nur sagen, dass akzentuierte Buchstaben und viele Sonderzeichen in Dateinamen zulässig sind und in den folgenden Szenarien Probleme verursachen können:

  • Sie geben Ihr Dateisystem für andere Computer frei, insbesondere für andere Betriebssysteme.
  • Sie geben Dateien für andere frei (und obwohl E-Mails bei Konvertierungen in der Regel recht gut sind, funktioniert dies manchmal einfach nicht).
  • Sie verwenden Shell-Skripte, um einige Aufgaben zu automatisieren (Leerzeichen sind besonders problematisch, obwohl es viele Möglichkeiten gibt, mit ihnen umzugehen).
  • Sie verwenden eine Dateifreigabe von einem anderen Computer.

...

asoundmove
quelle
3

Halten Sie sich an alphanumerische Dateinamen. Vermeiden Sie Leerzeichen oder ersetzen Sie Leerzeichen durch Unterstriche (_). Begrenzen Sie die Zeichensetzung in Dateinamen auf Punkte (.), Unterstriche (_) und Bindestriche (-). Im Allgemeinen werden Dateinamen in Kleinbuchstaben geschrieben, aber ich verwende CamelCase, wenn der Dateiname mehrere Wörter enthält.

Verwenden Sie Erweiterungen, die den Dateityp angeben. Programme benötigen keine Erweiterungen, da das Ausführungsbit zum Anzeigen von Programmen verwendet wird und die Shells wissen, wie Programme verschiedener Typen ausgeführt werden. Es ist üblich, aber nicht erforderlich, (.sh) für Shell-Skripte und (.pl) für Perl-Skripte. Die ausführbaren Windows-Erweiterungen .bat, .com, .scr und .exe geben die ausführbaren Windows-Dateien unter Unix an.

Wähle einen Standard und halte dich daran. Aber es wird nichts kaputt machen, wenn Sie es vermeiden.

Versteckte (oder Punkt-) Dateien haben Namen, die mit einem Punkt beginnen. Diese werden normalerweise nicht in Verzeichnislisten angezeigt. Verwenden Sie 'ls -a', um die Punktedateien in die Liste aufzunehmen.

BillThor
quelle
5
CamelCase ist ein Anti-Pattern unter Unix. Das OP fragte nach Konventionen.
Mikel
2
Es ist nicht "schlecht" gegen "gut". Es ist "so wird es normalerweise gemacht". Es ist eine Konvention, um die die OP gebeten hat. Der Grund? Dies könnte daran liegen, dass Unix-Benutzer die Umschalttaste nicht gerne drücken, dass alte Systeme nur GROSSBUCHSTABEN hatten oder aus einem anderen Grund. Ich bin mir nicht sicher.
Mikel
@Mikel Ich programmiere auch Java, wo CamelCase eine Konvention ist. Manchmal widersprechen sich Muster und Konventionen.
BillThor
.scr ist auch eine ausführbare Windows-Erweiterung.
LawrenceC
1
@ultrasawblade Danke, zeigt, wie oft ich Windows skripte. Ich habe versucht, die selteneren ausführbaren Erweiterungen wie cmd, pif, vb *, wsh und den Rest zu überspringen.
BillThor
2

Eine Konvention ist die Verwendung von "_", um Leerzeichen als Trennzeichen zwischen Wörtern zu ersetzen. Andere Zeichen könnten verwendet werden, um Leerzeichen zu ersetzen, aber es gibt etwas stärkere herkömmliche Verwendungen für "-" und "." In Pfadnamen wird daher normalerweise "_" bevorzugt.

Leerzeichen sind in Pfadnamen zulässig, werden jedoch herkömmlicherweise vermieden, da sie die Angabe des Pfadnamens ("Foo-Bar") oder die Maskierung der Leerzeichen (Foo \ Bar) erfordern. Ein korrekt geschriebenes Shell-Skript zitiert Variablen, die möglicherweise Leerzeichen enthalten, insbesondere Pfadnamen. Wenn Sie dies jedoch nicht tun, wird dies häufig übersehen. Bei der Ausführung eines einmaligen Befehls, der über die Befehlszeile eingegeben wird, ist dies eine zusätzliche Eingabe.

Die Verwendung von "-" zum Trennen von Zahlenclustern, z. B. in Zeitstempeln oder Seriennummern, ist eine außerhalb des Dateisystemkontexts häufig verwendete Konvention. Verwenden von "." "Dateierweiterungen" zu trennen, die darauf hinweisen, dass der Dateityp sehr verbreitet ist und einige wichtige Tools davon abhängen. Beispielsweise erwartet das Paketverwaltungssystem unter Red Hat Enterprise Linux und seinen Derivaten, RPM, dass Paketdateien mit ".rpm" enden. Der traditionelle Tarball ist eine tar-Datei (".tar"), die mit einem Gzip (".gz") versehen wurde und so auf ".tar.gz" endet.

Wenn Sie diese zusammenfassen, erhalten Sie häufig Dateinamen, die wie "home_backup_2017-07-01.tar.gz" aussehen.

bgvaughan
quelle
2

Verwenden Sie -oder, _um Dateien
_für Funktionen
.für Erweiterungen zu benennen

cat << EOF > foo-bar.sh  
foo_bar() {  
echo baz  
}  
EOF  
Akhil J
quelle
0

Ich stimme David Oneill zu, dass Sie einfach mit etwas gehen sollten.

Aber es ist schön, wenn die Dateien im selben Verzeichnis sortiert werden können , also nicht die Nummer 0 ..10, sondern die Nummer 00 ..10.

Wenn Sie Datumsangaben in Namen verwenden, verwenden Sie ein Standard-Datumsformat wie ISO8601 .

Und haben Sie keine Angst davor, mehrere Zeichen zu verwenden, um logische Teile im Namen zu trennen. Wenn Sie _ (das war 3 _) verwenden, können Sie die regulären Ausdrücke für Dateinamen später vereinfachen.

Ihr Beispiel könnte dann ungefähr so ​​lauten:

backup_2011-06-19T114012___part002___random

Leicht zu lesen und leicht mit Skripten zu analysieren.

Johan
quelle
0

Wörter in einem Dateinamen können entweder mit _oder -gemäß der Unix-Konvention getrennt werden.

Wenn Sie verwenden -, ist die Eingabe einfacher und erspart Ihnen das Drücken der UMSCHALTTASTE. Aber da es -so wenig Platz braucht, ist es etwas schwierig, Worttrennungen im Vergleich zu lesen _. Das _Trennen von Wörtern lässt es viel sauberer aussehen, da _es mehr Platz beansprucht.

In Shell-Skripten und anderen Computerprogrammen _werden Variablen für mehrere Wörter verwendet, z MY_ENVIRONMENT_FILE. Die Dateinamen verwenden zu machen _und hält es im Einklang: MY_ENVIRONMENT_FILE=~/my_environment_file.

Wird in der Webentwicklung -für die Benennung von Dateien bevorzugt. Ein Grund ist wahrscheinlich, dass die Unterstreichung in Weblinks die Unterstriche verbergen und es möglicherweise schwierig machen kann, wenn Sie den Weblink von Hand eingeben.

In den meisten Editoren und Webseiten this_long_wordkann mit einem Doppelklick die vollständige Auswahl getroffen werden, jedoch nicht this-long-word.

GMaster
quelle
Hmmm, warum liest du deine Dateinamen in einer Schriftart mit variabler Breite? Öffnen Sie Ihre Terminal und -und _nehmen nur genau den gleichen Raum! :)
Wildcard
Haha du hast recht Ich verwende die gepatchte Schriftart SourceCodePro + Powerline + Awesome Regular. _Sieht selbst bei Monospace-Schriftarten sauberer aus, obwohl sie denselben Platz beansprucht wie -. Ich hätte das Wort "anscheinend" verwenden sollen. In Bezug auf die _und -bei Verwendung von Monospace-Schriftarten lässt sich der Unterschied am besten mit diesem analogen Bild erklären: evsc.net/v8/wp/wp-content/uploads/2010/09/…
GMaster
-1

Es gibt definitiv einen Standard für Linux. Wenn Sie sich die Dateinamen in einem Linux-System ansehen, werden sie mit Bindestrichen in Kleinbuchstaben dargestellt: / usr / bin / ssh-keygen. Dies ist in einem der Linux Standards Base-Dokumente angegeben, die ich derzeit nicht finde. Es wird auch von GNU spezifiziert, das angibt, Unterstriche für Variablennamen und Bindestriche für Dateinamen zu verwenden.

Bill Chatfield
quelle
-2

Hinzufügen zu dem, was alle anderen gesagt haben:

1 - Auch wenn Linux Erweiterungen nicht sonderlich wichtig ist, stellt Windows sicher, dass jede Datei, die Sie jemandem geben möchten, die entsprechende Erweiterung hat.

2-Camel Caps scheinen die am einfachsten zu verwendenden Skripte zu sein, bei denen sich keine Sonderzeichen um Escape-Sequenzen kümmern müssen.

Yitzchak
quelle
5
-1. CamelCase wird NICHT unter Linux verwendet.
Mikel