Convención de nomenclatura de archivos Unix [cerrada]


61

Me preguntaba cuál es la convención de nomenclatura para archivos en Unix. No estoy seguro de esto, pero creo que tal vez hay una convención de nomenclatura universal que uno debería seguir.

Por ejemplo, quiero nombrar un archivo que diga: backupcon part 2yrandom

Debería hacerlo así:

backup_part2_random

O

backup-part2-random

O

backup.part2.random

Espero que la pregunta sea clara. Básicamente, quiero elegir un formato que se ajuste a la filosofía de Unix.


44
Como comentario general sobre las "convenciones" ... Acabo de leer todas las respuestas hasta ahora, y me sorprendió lo extraño que es casi una obsesión por usar solo un caso en un sistema donde (creo) uno de sus puntos fuertes es la capacidad de utilizar de manera significativa ambos casos ... ¿era el diseño original (mayúsculas y minúsculas) una sobre diseño) ... sólo meditando
Peter.O

mi opinión: no hay convención. los nombres de archivo son solo cadenas. Elige tu estilo favorito.
Glenn Jackman

1
Es porque nadie quiere recordar la capitalización de los comandos, por lo que todos usan lo mismo.
LtWorf

Respuestas:


58

.se usa para separar una extensión de tipo de archivo, por ejemplo foo.txt.

-o _se usa para separar palabras lógicas, por ejemplo, my-big-file.txto algunas veces my_big_file.txt. -es mejor porque no tiene que presionar la tecla Mayús (al menos con un teclado de PC estándar en inglés de EE. UU.), otros prefieren _porque se parece más a un espacio.

Entonces, si entiendo su ejemplo, backup-part2-randomo backup_part2_randomsería más cercano a la convención normal de Unix.


CamelCase normalmente no se usa en sistemas Linux / Unix. Echa un vistazo a los nombres de archivo en /biny /usr/bin. CamelCase es la excepción más que la regla en los sistemas Unix y Linux.

( NetworkManageres el único ejemplo que se me ocurre que usa CamelCase, y fue escrito por un desarrollador de Mac. Muchos se han quejado de esta elección de nombre. En Ubuntu, en realidad han cambiado el nombre del script network-manager).

Por ejemplo, /usr/binen mi 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 incluso entonces, ninguno de los archivos que comienzan con mayúscula usa CamelCase:

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

El .carácter también se puede usar para rotar cosas, no solo para especificar una extensión. Por ejemplo my.log my.log.1 my.log.2.gz.
Depado

Entonces el guión / menos / guión es más común que el guión bajo.
Hugo

@ Hugo Sí. Lo anterior muestra menos (409) vs subrayado (178).
Mikel

Gracias. ¿Tiene alguna referencia para estas convenciones?
Proletariado

3
+1 para las referencias. (@Proletariado, el lsresultado /usr/bin es una referencia. Esta es una pregunta sobre convenciones. )
Comodín el

36

Mucho más importante que una convención particular sea ser consistente. Elige un estilo y quédate con él.


19

Mi opinión sobre las convenciones de nombre de archivo de Unix / Linux:

  • Los sistemas de archivos Unix / Linux no soportan inherentemente la noción de una extensión. El concepto de una extensión de archivo existe por completo como algo con el apoyo de los servicios públicos como cp, lso la cáscara que está utilizando. Creo que también es así en NTFS, pero podría estar equivocado.

  • Los ejecutables, incluidos los scripts de shell, generalmente nunca tienen ningún tipo de extensión. Las secuencias de comandos tendrán una línea hashbang (es decir #!/bin/bash) que identifica qué programa debe interpretarlo.

  • Cualquier ejecutable que tenga dos letras es muy importante. Por lo tanto, no nombre sus archivos ejecutables de dos letras. Cualquier archivo en /etcque termina en tabes también muy importante, como fstab, mtab, inittab.
  • A veces .dse agrega a los nombres de directorio, particularmente en /etc, pero esto no está muy extendido (ACTUALIZACIÓN: https://serverfault.com/questions/240181/what-does-the-suffix-d-mean-in-linux )
  • rces ampliamente utilizado para scripts o archivos de configuración, ya sea antes (por ejemplo, rc.local) o sufijos ( .vimrc)
  • La comunidad Unix / Linux nunca ha tenido un límite de tres caracteres en las extensiones y frunce el ceño al acortar extensiones bien conocidas para que quepan. Por ejemplo, no use .htmal final de archivos HTML en Unix / Linux, use .html.
  • En un conjunto de archivos, un nombre de archivo a veces se escribe con mayúscula o en mayúsculas, por lo que aparece en la cabecera de una lista de directorio. El ejemplo clásico está Makefileen los paquetes fuente. Solo haz esto para cosas como README.
  • ~se usa para identificar un archivo de respaldo o un directorio, como en important_stuff~, o /etc~. Muchas conchas se expandirán un solitario ~a $HOME.
  • Los archivos de la biblioteca casi siempre comienzan con lib. La excepción es zliby probablemente algunos otros.
  • Las secuencias de comandos que inetd llama a veces se etiquetan con un encabezado in., como in.tftpd.
  • La terminación z en vmlinuzsignifica comprimido, pero nunca he visto ningún otro archivo llamado de esta manera.

2
A menudo veo scripts de shell con una .sh"extensión" en ellos. Personalmente, me resulta un poco molesto, pero tengo que admitir que puedo ignorar alguna buena razón para usar el .sh.
Dan Molding

44
Me viene a la mente que es útil enfatizar el hecho de que es un script basado en texto y no un binario.
LawrenceC

1
@DanMoulding, personalmente, lo uso .shen scripts que (1) no están destinados a ejecutarse de manera interactiva, sino solo desde otros scripts / programas, o (2) están diseñados para el abastecimiento en lugar de la ejecución. Para el primero deben ser ejecutables; para este último, dejo el bit ejecutable desactivado y uso la línea shebang solo para documentar para qué shell están escritas las funciones.
Comodín el

3
@Wildcard que tengo (hace 6 años) adquirí este mismo hábito. La extensión en realidad tiene mucho sentido para obtener bits de script. Por ejemplo, a partir de un script ejecutable escrito para zsh (es decir, #!/bin/zshen la parte superior), sabe que puede obtener otro archivo de forma segura con la extensión .zsh y asegurarse de que contenga el código zsh legal. Si su script ejecutable es estrictamente compatible con Bourne Shell (es decir, #!/bin/shen la parte superior), entonces sabrá que obtener ese archivo .zsh será problemático.
Dan Molding el

44
Creo que usar ".sh", ".py", ".pl", etc., es conveniente, y algunos editores de texto (por ejemplo, Geany) los usan para adivinar por primera vez el esquema de resaltado de sintaxis adecuado.
bgvaughan

7

En unix, el nombre de archivo es solo una cadena, a diferencia de DOS, donde el nombre de archivo se compone de nombre y extensión. Por lo tanto, cualquiera de los nombres de archivo dados es completamente aceptable.

Pero muchos programas aún usan sufijos de archivos que comienzan con puntos para distinguir diferentes tipos de archivos, es decir, Apache Web Server usa sufijos para establecer el tipo MIME correcto en los encabezados de respuesta.


55
Si bien gelraen es 100% correcto: Unix / Linux como tal no se preocupa por las extensiones de archivo, los sabores modernos de Linux sí se preocupan en la medida en que algunas extensiones de shell proporcionan identificación especial (colores u otros) de ciertos tipos de archivos y los administradores de archivos proporcionan asociaciones automáticas con programas Pero igual de importante es que el usuario humano sepa qué archivo es de qué tipo. Para ese fin, es conveniente apegarse a un esquema estándar no solo coherente para usted, sino también para los demás. A este respecto, las cosas no deberían ser demasiado diferentes a las de MS Windows (o MIME).
asoundmove

Dicho esto, a veces, varios estilos de extensión diferentes pueden coincidir con el mismo propósito. Por lo tanto, .tar.gz es equivalente a .tgz, .tar.bz2 = .tbz, .ps.gz a menudo se acorta como .ps (confusamente) y estoy seguro de que hay muchos más.
asoundmove

@asoundmove .ps.gz significa que es un archivo comprimido .ps. Al igual que .tar.gz significa archivo comprimido .tar.
jonescb

1
@jonescb, sí, por supuesto. Mi punto sobre que sea confuso es que cuando veo .ps espero un archivo no comprimido (que debería ser capaz de detectar o menos), pero a menudo los archivos .ps están comprimidos y, de hecho, deberían ser .ps.gz para mayor claridad ( ya que requieren zcat o zless para ver el código fuente). Algunas personas decidieron simplemente sufijar archivos PostScript comprimidos con .ps de todos modos porque a algunos visores ps comunes en realidad no les importa si están comprimidos o no.
asoundmove

6

Dos pensamientos:

  1. En la Naming Variables, Functions, and Filessección de los Estándares de codificación GNU encontrará:

    Utilice guiones bajos para separar las palabras en un nombre, de modo que los comandos de palabras de Emacs puedan ser útiles dentro de ellos. Se adhieren a minúsculas;

    Si bien la OMI dice "Deberías usar _porque emacs" parece un poco anticuado, sin embargo, está en su documento de "estándares".

  2. Supongamos por un momento que todos estamos de acuerdo en que el kernel de Linux es el ser-todo-y-todo-fin * de los proyectos de Linux, y que las convenciones utilizadas allí son lo que podría considerarse una convención 'estándar'.

    grep-ing fuente para el kernel de Linux encontrará lo siguiente:

    • 44.6% del tiempo solo se usa guión
    • El 54.1% del tiempo solo subraya
    • 1.2% del tiempo que un archivo usa ambos.

Curiosamente, la fuente de git pesa 85% para guiones, 3.8% para guiones bajos y 11.1% para ambos.

La elección es clara, debate terminado. ;)

Opinión personal: uso guiones por razones estéticas y de cambio. Si está trabajando en un equipo, vote. Pero para reiterar lo que se ha dicho, sea ​​consistente .

* o "be_all y end_all" si quieres


4

Caracteres que no debes usar en los nombres de archivo:

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

Delimitadores de caracteres que debe usar para facilitar la lectura de los nombres:

_ -. :

(En algunos casos, ":" tiene un significado especial)


55
Por supuesto, ni siquiera puedes usar "/" en los nombres de archivo. Todo lo demás es posible. Y si quieres dificultar el acceso, incluso útil ;-)
Jürgen A. Erhard

La lista es en realidad mucho más larga, incluidos los caracteres de control y no ASCII. Sí, puede tener un retroceso como parte del nombre de un archivo * nix.
l0b0

1
Más concretamente, la mayoría de los sistemas * nix solo permiten dos caracteres específicos en los nombres de archivo: el /separador de ruta y el terminador de cadena \ 0 (ASCII cero).
un CVn

4

Para agregar a lo que otros han dicho, solo diría que si bien las letras acentuadas y muchos caracteres especiales son legales en los nombres de archivo, pueden causar problemas en cualquiera de los siguientes escenarios:

  • Compartes tu sistema de archivos con otras computadoras, particularmente con diferentes sistemas operativos;
  • Compartes archivos con otros (y aunque el correo electrónico tiende a ser bastante bueno con las conversiones, a veces simplemente no funciona);
  • Utiliza scripts de shell para automatizar algunas tareas (los espacios son particularmente problemáticos, aunque hay muchas formas de tratarlos);
  • Utiliza un recurso compartido de archivos de otra computadora.

...


3

Se adhieren a los nombres de archivo alfanuméricos. Evite espacios o reemplace espacios con guiones bajos (_). Limite la puntuación en los nombres de archivo a puntos (.), Guiones bajos (_) y guiones (-). En general, los nombres de los archivos están en minúsculas, pero uso CamelCase cuando tengo varias palabras en el nombre del archivo.

Use extensiones que indiquen el tipo de archivo. Los programas no necesitan extensiones ya que el bit de ejecución se usa para indicar programas, y los shells saben cómo ejecutar programas de varios tipos. Es común pero no es obligatorio (.sh) para los scripts de shell y (.pl) para los scripts de perl. Las extensiones ejecutables de Windows .bat, .com, .scr y .exe indican los ejecutables de Windows en Unix.

Elija un estándar y manténgalo. Pero no romperá las cosas si lo evitas.

Los archivos ocultos (o de punto) tienen nombres que comienzan con un punto. Estos normalmente no aparecen en las listas de directorios. Use 'ls -a' para incluir los archivos de puntos en la lista.


55
CamelCase es un anti patrón en Unix. El OP preguntaba por las convenciones.
Mikel

2
No es "malo" versus "bueno". Es "así es como se suele hacer". Es una convención que pedía el OP. ¿La razón? Podría ser porque a las personas de Unix no les gusta presionar Shift, podría ser porque los sistemas antiguos solo tenían MAYÚSCULAS, o por otra razón. No estoy seguro.
Mikel

@Mikel También programo Java donde CamelCase es una convención. A veces los patrones y convenciones entran en conflicto.
BillThor

.scr también es una extensión ejecutable de Windows.
LawrenceC

1
@ultrasawblade Gracias, muestra la frecuencia con la que escribo Windows. Traté de omitir las extensiones ejecutables más raras como cmd, pif, vb *, wsh y el resto de ellas.
BillThor

2

Una convención es usar "_" para reemplazar espacios como separadores entre palabras. Se podrían usar otros caracteres para reemplazar espacios, pero hay usos convencionales ligeramente más fuertes para "-" y "". en los nombres de ruta, por lo que generalmente se prefiere "_".

Los espacios son legales en los nombres de ruta, pero se evitan convencionalmente, ya que requieren citar el nombre de ruta ("foo bar") o escapar de los espacios (foo \ bar). Un script de shell correctamente escrito citará variables que pueden incluir espacios, particularmente nombres de ruta, pero no hacerlo es un descuido común, y es una gran cantidad de tipeo adicional cuando se hace un comando único ingresado en la línea de comando.

El uso de "-" para separar grupos de números, como en marcas de tiempo o números de serie, es una convención comúnmente utilizada fuera del contexto de los sistemas de archivos. Utilizando "." para separar "extensiones de archivo" que indican que el tipo de archivo es muy común, y algunas herramientas importantes dependen de él. Por ejemplo, el sistema de administración de paquetes en Red Hat Enterprise Linux y sus derivados, RPM, espera que los archivos de paquetes terminen con ".rpm". El tarball tradicional es un archivo tar (".tar") que se ha comprimido (".gz") y termina en ".tar.gz".

Entonces, al juntarlos, a menudo terminas con nombres de archivo que se parecen a "home_backup_2017-07-01.tar.gz"


2

usar -o _para nombrar archivos
_para funciones
.para extensiones

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

0

Estoy de acuerdo con David Oneill en que deberías ir con algo.

Pero es bueno si los archivos se pueden ordenar en el mismo directorio, así que no numere 0 ..10 sino número 00 ..10.

Cuando use fechas en los nombres, elija un formato de fecha estándar como ISO8601 .

Y no tenga miedo de usar varios caracteres para separar las partes lógicas en el nombre. Si usa _ (que era 3 _), puede simplificar las expresiones regulares en los nombres de archivo más adelante.

Entonces su ejemplo podría ser algo como esto:

backup_2011-06-19T114012___part002___random

Fácil de leer y fácil de analizar con scripts.


0

Las palabras en un nombre de archivo se pueden separar con _o -según la convención de Unix.

Si lo usa -, es más fácil escribir, le ahorra presionar MAYÚS. Pero dado que -ocupa tan poco espacio, es un poco difícil leer separaciones de palabras en comparación _. Usar _para separar palabras hace que se vea mucho más limpio ya que _ocupa más espacio.

En los scripts de shell y otras programaciones de computadora, _se usan para variables de varias palabras, como MY_ENVIRONMENT_FILE. Haciendo uso de los nombres de archivo _y la mantiene constante: MY_ENVIRONMENT_FILE=~/my_environment_file.

En desarrollo web, -se prefiere para nombrar archivos. Probablemente, una de las razones es que el subrayado en los enlaces web puede ocultar los guiones bajos y puede dificultarlo si escribe el enlace a mano.

En la mayoría de los editores y en las páginas web, this_long_wordse puede seleccionar completamente con un doble clic, pero no this-long-word.


Hmmm, ¿por qué estás leyendo tus nombres de archivo en una fuente de ancho variable? Abra su terminal y -y _tomar hasta exactamente el mismo espacio! :)
Comodín el

Jaja, tienes razón. Uso la fuente parcheada SourceCodePro + Powerline + Awesome Regular. Incluso con las fuentes monoespaciales, se _ve más limpio a pesar de que ocupa el mismo espacio que -. Debería haber usado la palabra "aparentemente". En cuanto a la _y -al utilizar fuentes de espacio sencillo, la diferencia puede explicarse mejor con esta imagen analógica: evsc.net/v8/wp/wp-content/uploads/2010/09/...
GMaster

-1

Definitivamente hay un estándar para Linux. Si observa los nombres de archivo en cualquier sistema Linux, están en minúsculas con guiones: / usr / bin / ssh-keygen. Esto se especifica en uno de los documentos de Linux Standards Base que no puedo encontrar en este momento. También lo especifica GNU, que dice usar guiones bajos para nombres de variables y guiones para nombres de archivos.


-2

Para agregar a lo que todos los demás han dicho:

1-A pesar de que a Linux no le importan mucho las extensiones, a Windows sí, así que asegúrese de que cualquier archivo que piense darle a alguien tenga la extensión adecuada.

2-Camel caps parece ser el guión más fácil de usar, sin caracteres especiales para preocuparse por las secuencias de escape.


55
-1. CamelCase NO se usa en Linux.
Mikel
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.