Convenzione di denominazione dei file Unix [chiuso]


61

Mi chiedevo qual è la convenzione di denominazione per i file in Unix? Non ne sono sicuro, ma penso che ci sia forse una convenzione di denominazione universale da seguire?

Ad esempio, voglio nominare un file dire: backupcon part 2erandom

Dovrei farlo in questo modo:

backup_part2_random

O

backup-part2-random

O

backup.part2.random

Spero che la domanda sia chiara. Fondamentalmente, voglio scegliere un formato conforme alla filosofia Unix.


4
Come commento generale riguardo alle "convenzioni" ... Finora ho appena letto tutte le risposte, e mi ha colpito quanto sia strano che ci sia quasi un'ossessione nell'usare un solo caso in un sistema in cui (penso) uno dei suoi punti di forza è la capacità di utilizzare in modo significativo entrambi i casi ... Era il design originale (sensibile al maiuscolo / minuscolo) un design eccessivo) ... solo riflettendo
Peter.O

la mia opinione: non esiste una convenzione. i nomi dei file sono solo stringhe. scegli il tuo stile preferito.
Glenn Jackman,

1
È perché nessuno vuole ricordare la maiuscola dei comandi, quindi usano tutti lo stesso.
Ten.

Risposte:


58

.viene utilizzato per separare un'estensione del tipo di file, ad es foo.txt.

-o _viene utilizzato per separare le parole logiche, ad esempio my-big-file.txto talvolta my_big_file.txt. -è meglio perché non è necessario premere il tasto Maiusc (almeno con una tastiera standard per PC inglese americano), altri preferiscono_ perché sembra più uno spazio.

Quindi, se capisco il tuo esempio, backup-part2-randomo backup_part2_randomsarei il più vicino alla normale convenzione Unix.


CamelCase normalmente non viene utilizzato su sistemi Linux / Unix. Dai un'occhiata ai nomi dei file in /bine /usr/bin. CamelCase è l'eccezione piuttosto che la regola sui sistemi Unix e Linux.

( NetworkManagerè l'unico esempio che mi viene in mente che utilizza CamelCase ed è stato scritto da uno sviluppatore Mac. Molti si sono lamentati di questa scelta di nome. Su Ubuntu, in realtà hanno rinominato lo script innetwork-manager .)

Ad esempio, /usr/binsul mio sistema:

$ 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

e anche allora, nessuno dei file che iniziano con una maiuscola utilizza CamelCase:

$ ls -d [A-Z]*
GET  HEAD  POST  X11  Xvnc  Xvnc4

Il .carattere può anche essere usato per ruotare le cose, non solo per specificare un'estensione. Per esempio my.log my.log.1 my.log.2.gz.
Depado,

Quindi il trattino / meno / trattino è più comune del trattino basso.
Hugo

@Hugo Sì. Quanto sopra mostra meno (409) vs carattere di sottolineatura (178).
Mikel

Grazie. Avete riferimenti per queste convenzioni?
Proletariato

3
+1 per i riferimenti. (@Proletariat, l' lsoutput da /usr/bin è un riferimento. Questa è una domanda sulle convenzioni. )
Wildcard

36

Molto più importante che una particolare convenzione sia coerente. Scegli uno stile e mantienilo.


19

La mia opinione sulle convenzioni sui nomi dei file Unix / Linux:

  • I filesystem Unix / Linux non supportano intrinsecamente la nozione di estensione. Il concetto di estensione del file esiste come qualcosa di completamente supportato da utility come cp, lso la shell che si sta utilizzando. Credo che sia così anche su NTFS, ma potrei sbagliarmi.

  • Gli eseguibili, inclusi gli script di shell, di solito non hanno mai alcun tipo di estensione. Gli script avranno una linea hashbang (cioè #!/bin/bash) che identifica quale programma dovrebbe interpretarlo.

  • Qualsiasi eseguibile lungo due lettere è estremamente importante. Quindi non nominare i nomi dei file di due lettere degli eseguibili. Qualsiasi file in /etcche termina con tabè anche super importante, come ad esempio fstab, mtab, inittab.
  • A volte .dviene aggiunto ai nomi delle directory, in particolare in /etc, ma questo non è molto diffuso (AGGIORNAMENTO: https://serverfault.com/questions/240181/what-does-the-suffix-d-mean-in-linux )
  • rcè ampiamente usato per script o file di configurazione, sia antependenti (ad es. rc.local) sia suffissi ( .vimrc)
  • La comunità Unix / Linux non ha mai avuto un limite di tre caratteri per le estensioni e aggrotta le sopracciglia all'accorciamento delle estensioni ben note per adattarsi. Ad esempio, non utilizzare .htmalla fine dei file HTML su Unix / Linux, utilizzare .html.
  • In un set di file, a volte un nome file è in maiuscolo o in maiuscolo, quindi appare in testa a un elenco di directory. L'esempio classico è Makefilenei pacchetti sorgente. Fallo solo per cose del genere README.
  • ~viene utilizzato per identificare un file di backup o una directory, come in important_stuff~, o /etc~. Molti conchiglie si espanderà un solitario ~a $HOME.
  • I file di libreria iniziano quasi sempre con lib. L'eccezione è zlibe probabilmente alcune altre.
  • Gli script chiamati da inetd a volte sono taggati con un carattere iniziale in., come in.tftpd.
  • La z finale in vmlinuzsignifica zippato, ma non ho mai visto nessun altro file chiamato in questo modo.

2
Vedo spesso script di shell con .sh"estensione" su di essi. Personalmente trovo che sia un po 'fastidioso, ma devo ammettere che potrei essere ignaro di qualche buona ragione per usare il .sh.
Dan Molding,

4
Mi viene in mente che è utile sottolineare il fatto che si tratta di uno script testuale e non binario.
LawrenceC

1
@DanMoulding, personalmente, utilizzo .shsu script che (1) non sono pensati per essere eseguiti in modo interattivo, ma solo da altri script / programmi o (2) sono progettati per l'approvvigionamento piuttosto che per l'esecuzione. Per il primo devono essere eseguibili; per quest'ultimo lascio spento il bit eseguibile e uso la riga shebang solo per la documentazione di quale shell sono scritte le funzioni.
Wildcard il

3
@Wildcard Da allora (6 anni fa) ho preso questa stessa abitudine. L'estensione in realtà ha molto senso per l'approvvigionamento di bit di script. Ad esempio, da uno script eseguibile scritto per zsh (cioè #!/bin/zshnella parte superiore) sai che puoi tranquillamente creare un altro file con l'estensione .zsh ed essere sicuro che contenga un codice zsh legale. Se il tuo script eseguibile è rigorosamente conforme a Bourne Shell (cioè #!/bin/shnella parte superiore), allora sapresti che reperire quel file .zsh sarà problematico.
Dan Molding,

4
Trovo che usare ".sh", ".py", ".pl", ecc. Sia conveniente, e alcuni editor di testo (ad es. Geany) li usano per fare una prima ipotesi sul corretto schema di evidenziazione della sintassi.
bgvaughan,

7

In unix il nome del file è solo una stringa, a differenza del DOS, in cui il nome del file era composto da nome ed estensione. Quindi uno qualsiasi dei nomi di file è completamente accettabile.

Tuttavia, molti programmi utilizzano ancora suffissi di file che iniziano con il punto per distinguere diversi tipi di file, ovvero Apache Web Server utilizza suffissi per impostare il tipo MIME corretto nelle intestazioni delle risposte.


5
Sebbene gelraen sia corretto al 100%: Unix / Linux in quanto tale non si preoccupa delle estensioni di file, i moderni sapori di Linux si preoccupano in quanto alcune estensioni della shell forniscono un'identificazione speciale (colori o altro) di determinati tipi di file e i gestori dei file forniscono associazioni automatiche con i programmi. Ma altrettanto importante è per l'utente umano sapere quale file è di che tipo. A tal fine è conveniente attenersi a uno schema standard non solo coerente per te stesso ma con gli altri. A questo proposito, le cose non dovrebbero essere eccessivamente diverse da quelle di MS Windows (o MIME).
asoundmove,

Detto questo a volte diversi stili di estensione diversi possono corrispondere allo stesso scopo. Pertanto .tar.gz equivale a .tgz, .tar.bz2 = .tbz, .ps.gz è spesso abbreviato in .ps (in modo confuso) e sono sicuro che ce ne sono molti altri.
asoundmove,

@asoundmove .ps.gz significa che è un file .ps compresso. Proprio come .tar.gz significa file .tar compresso.
jonescb,

1
@jonescb, sì certo. Il mio punto di confusione è che quando vedo .ps mi aspetto un file non compresso (che dovrei essere in grado di cat o meno), ma spesso i file .ps sono compressi e in realtà dovrebbero essere .ps.gz per chiarezza ( poiché richiedono zcat o zless per la visualizzazione del codice sorgente). Alcune persone hanno deciso di aggiungere semplicemente il suffisso ai file PostScript compressi con .ps perché ad alcuni visualizzatori ps comuni in realtà non importa se sono compressi o meno.
asoundmove,

6

Due pensieri:

  1. Nella Naming Variables, Functions, and Filessezione degli standard di codifica GNU troverai:

    Si prega di utilizzare i trattini bassi per separare le parole in un nome, in modo che i comandi di parole Emacs possano essere utili al loro interno. Stick per minuscole;

    Mentre l'IMO dice "Dovresti usare _perché emacs" sembra un po 'datato, ma è comunque nel loro documento "standard".

  2. Supponiamo per un momento che siamo tutti d'accordo sul fatto che il kernel Linux sia il "tutto e per tutto" * dei progetti Linux e che le convenzioni utilizzate lì siano quelle che potrebbero essere considerate convenzioni "standard".

    grep-ing sorgente per il kernel linux troverai quanto segue:

    • Il 44,6% delle volte viene utilizzato solo trattino
    • Il 54,1% delle volte sottolinea solo
    • 1,2% delle volte in cui un file utilizza entrambi.

È interessante notare che la fonte di git pesa all'85% per i trattini, al 3,8% per i trattini bassi e all'11,1% per entrambi.

La scelta è chiara, si discute. ;)

Opinione personale: utilizzo i trattini per motivi estetici e di spostamento dei tasti. Se lavori in una squadra, vota. Ma per ribadire quanto detto, sii coerente .

* o "be_all and end_all", se lo desideri


4

Personaggi che non dovresti usare nei nomi dei file:

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

Delimitatori di caratteri che dovresti usare per facilitare la lettura dei nomi:

_ -. :

(In alcuni casi ":" ha un significato speciale però)


5
Ovviamente, non puoi nemmeno usare "/" nei nomi dei file. Tutto il resto è possibile. E se vuoi rendere difficile l'accesso, anche utile ;-)
Jürgen A. Erhard

L'elenco è in realtà molto più lungo, compresi i caratteri di controllo e non ASCII. Sì, puoi avere un backspace come parte del nome di un file * nix.
l0b0

1
Più precisamente, la maggior parte dei sistemi * nix non consente solo due caratteri specifici nei nomi dei file: il /separatore di percorso e il terminatore di stringa \ 0 (zero ASCII).
un CVn il

4

Per aggiungere ciò che altri hanno detto, direi solo che mentre le lettere accentate e molti caratteri speciali sono legali nei nomi dei file, possono causare problemi in uno dei seguenti scenari:

  • Condividi il tuo filesystem con altri computer, in particolare con diversi sistemi operativi;
  • Condividi i file con altri (e sebbene l'e-mail tenda a essere abbastanza buona con le conversioni, a volte semplicemente non funziona);
  • Gli script della shell vengono utilizzati per automatizzare alcune attività (gli spazi sono particolarmente problematici, sebbene ci siano molti modi per gestirli);
  • Si utilizza una condivisione file da un altro computer.

...


3

Attenersi ai nomi di file alfanumerici. Evita gli spazi o sostituisci gli spazi con caratteri di sottolineatura (_). Limitare la punteggiatura nei nomi dei file a punti (.), Trattini bassi (_) e trattini (-). Generalmente i nomi dei file sono in minuscolo, ma uso CamelCase quando ho più parole nel nome del file.

Usa estensioni che indicano il tipo di file. I programmi non hanno bisogno di estensioni poiché il bit di esecuzione viene utilizzato per indicare i programmi e le shell sanno come eseguire programmi di vario tipo. È comune ma non è richiesto (.sh) per gli script di shell e (.pl) per gli script perl. Le estensioni eseguibili di Windows .bat, .com, .scr e .exe indicano eseguibili di Windows su Unix.

Scegli uno standard e attenersi ad esso. Ma non si romperà le cose se lo eviti.

I file nascosti (o punti) hanno nomi che iniziano con un punto. Normalmente questi non vengono visualizzati negli elenchi di directory. Usa 'ls -a' per includere i file punto nell'elenco.


5
CamelCase è un modello anti su Unix. L'OP stava chiedendo delle convenzioni.
Mikel,

2
Non è "cattivo" contro "buono". È "questo è come è fatto di solito". È una convenzione richiesta dall'OP. La ragione? Potrebbe essere perché alle persone di Unix non piace premere Shift, potrebbe essere perché i vecchi sistemi avevano solo MAIUSCOLO, o per un'altra ragione. Non ne sono sicuro.
Mikel,

@Mikel Inoltre programma Java dove CamelCase è una convenzione. Talvolta conflitti tra schemi e convenzioni.
BillThor,

.scr è anche un'estensione eseguibile di Windows.
LawrenceC,

1
@ultrasawblade Grazie, mostra quanto spesso scrivo Windows. Ho provato a saltare le estensioni eseguibili più rare come cmd, pif, vb *, wsh e le altre.
BillThor,

2

Una convenzione è quella di utilizzare "_" per sostituire gli spazi come separatori tra le parole. Altri caratteri potrebbero essere usati per sostituire gli spazi, ma ci sono usi convenzionali leggermente più forti per "-" e "." nei nomi dei percorsi, quindi di solito è preferito "_".

Gli spazi sono legali nei nomi dei percorsi, ma sono convenzionalmente evitati, perché richiedono la citazione del nome del percorso ("foo bar") o la fuga degli spazi (foo \ bar). Uno script shell correttamente scritto citerà le variabili che possono includere spazi, in particolare i nomi dei percorsi, ma non farlo è una svista comune, ed è un sacco di extra digitando quando si esegue un comando unico immesso nella riga di comando.

L'uso di "-" per separare gruppi di numeri, come nei timestamp o nei numeri di serie, è una convenzione comunemente usata al di fuori del contesto dei filesystem. Utilizzando "." separare le "estensioni di file" che indicano che il tipo di file è molto comune e alcuni strumenti importanti dipendono da esso. Ad esempio, il sistema di gestione dei pacchetti su Red Hat Enterprise Linux e i suoi derivati, RPM, prevede che i file dei pacchetti finiscano con ".rpm". Il tarball tradizionale è un file tar (".tar") che è stato compresso con gzip (".gz") e quindi finisce in ".tar.gz".

Quindi, unendoli insieme, si finisce spesso con nomi di file che sembrano "home_backup_2017-07-01.tar.gz"


2

utilizzare -o _per denominare i file
_per le funzioni
.per le estensioni

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

0

Sono d'accordo con David Oneill che dovresti semplicemente andare con qualcosa.

Ma è bello se i file sono ordinabili nella stessa directory, quindi non numero 0 ..10 ma numero 00 ..10.

Quando si utilizzano le date nei nomi, utilizzare un formato data standard come ISO8601 .

E non abbiate paura di usare più caratteri per separare le parti logiche nel nome. Se usi _ (che era 3 _), puoi semplificare le regexps sui nomi dei file in seguito.

Quindi il tuo esempio potrebbe essere qualcosa del genere:

backup_2011-06-19T114012___part002___random

Facile da leggere e da analizzare con gli script.


0

Le parole in un nome file possono essere separate _o -secondo la convenzione Unix.

Se lo usi -, è più facile da scrivere, ti salva dalla pressione di MAIUSC. Ma dal momento che -occupa così poco spazio, è un po 'difficile leggere le separazioni delle parole rispetto a _. L'uso _per separare le parole lo rende molto più pulito poiché _occupa più spazio.

Nella shell scripting e altri programmi per computer, _vengono utilizzati per variabili multi-word, come MY_ENVIRONMENT_FILE. Fare in modo che i nomi dei file vengano utilizzati _allo stesso modo:MY_ENVIRONMENT_FILE=~/my_environment_file .

Nello sviluppo web, -è preferito per la denominazione dei file. Uno dei motivi è probabilmente perché la sottolineatura nei collegamenti Web può nascondere i caratteri di sottolineatura e potrebbe rendere difficile se si sta digitando il collegamento Web a mano.

Nella maggior parte degli editor e delle pagine Web, è this_long_wordpossibile selezionarlo completamente con un doppio clic, ma non this-long-word.


Hmmm, perché stai leggendo i tuoi nomi di file con un carattere a larghezza variabile? Aprite il vostro terminale e -di _riprendere esattamente lo stesso spazio! :)
Wildcard il

Haha, hai ragione. Uso SourceCodePro + Powerline + Awesome Regular patched font. Anche con i caratteri monospace, _sembra più pulito anche se occupa lo stesso spazio di -. Avrei dovuto usare la parola "apparentemente". Per quanto riguarda _e -quando si usano i caratteri monospace, la differenza può essere meglio spiegata con questa immagine analogica: evsc.net/v8/wp/wp-content/uploads/2010/09/…
GMaster

-1

Esiste sicuramente uno standard per Linux. Se guardi i nomi dei file in qualsiasi sistema Linux, sono in minuscolo con trattini: / usr / bin / ssh-keygen. Questo è specificato in uno dei documenti Linux Standards Base che non riesco a trovare in questo momento. Viene anche specificato da GNU che dice di usare i trattini bassi per i nomi delle variabili e i trattini per i nomi dei file.


-2

Per aggiungere ciò che hanno detto tutti gli altri:

1-Anche se Linux non si preoccupa molto delle estensioni, Windows lo fa, quindi assicurati che qualsiasi file che prevedi di dare a chiunque abbia l'estensione appropriata.

I cappellini 2-Camel sembrano essere gli script più facili da usare, senza caratteri speciali di cui preoccuparsi per le sequenze di escape.


5
-1. CamelCase NON è utilizzato su Linux.
Mikel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.