Linux determina el tipo de archivo a través de un código en el encabezado del archivo. No depende de las extensiones de archivo para saber qué software se utilizará para abrir el archivo.
Eso es lo que recuerdo de mi educación. ¡Corrígeme en caso de que me equivoque!
Trabajar un poco con los sistemas de Ubuntu recientemente: Veo una gran cantidad de archivos en los sistemas que tienen extensiones como .sh
, .txt
, .o
,.c
Ahora me pregunto: ¿Estas extensiones son solo para humanos? ¿Para que uno tenga una idea de qué tipo de archivo es?
¿O también tienen algún propósito para el sistema operativo?
files
file-format
mime-type
mizech
fuente
fuente
gzip
,bzip2
,xz
- y así sucesivamente. Estos programas usan sufijos para separar la versión comprimida de un archivo de la versión sin comprimir que reemplazan. Los programas de compresión a menudo se quejan de sufijos incorrectos, aunque el archivo en realidad es un archivo comprimido del tipo que debería manejar.Respuestas:
Cuando interactúa con otros sistemas operativos que dependen de que las extensiones sean lo que son, es la idea más inteligente usarlos.
En Windows, el software de apertura se adjunta a las extensiones.
La apertura de un archivo de texto llamado "archivo" es más duro en Windows de abrir el mismo archivo llamado "archivo.txt" (que tendrá que cambiar el diálogo de abrir archivo desde
*.txt
que*.*
cada vez). Lo mismo ocurre con los archivos de texto separados por TAB y punto y coma. Lo mismo ocurre con la importación y exportación de correos electrónicos (extensión .mbox).En particular cuando codificas software. Abrir un archivo llamado "software1" que es un archivo HTML y "software2" que es un archivo JavaScript se vuelve más difícil en comparación con "software.html" y "software.js".
Si hay un sistema en Linux donde las extensiones de archivo son importantes, lo llamaría un error. Cuando el software depende de las extensiones de archivo, eso es explotable. Utilizamos una directiva de intérprete para identificar qué es un archivo ("los primeros dos bytes en un archivo pueden ser los caracteres" #! ", Que constituyen un número mágico (hexadecimal 23 y 21, los valores ASCII de" # "y"! ") a menudo denominado shebang,").
El problema más famoso con las extensiones de archivo fue LOVE-LETTER-FOR-YOU.TXT.vbs en Windows. Este es un script visual básico que se muestra en el explorador de archivos como un archivo de texto.
En Ubuntu cuando inicia un archivo desde Nautilus, recibe una advertencia de lo que va a hacer. Ejecutar un script desde Nautilus donde quiere iniciar algún software donde se supone que debe abrir gEdit es un problema obvio y recibimos una advertencia al respecto.
En la línea de comando cuando ejecuta algo, puede ver visualmente cuál es la extensión. Si termina en .vbs, comenzaría a sospechar (no es que .vbs sea ejecutable en Linux. Al menos no sin un poco más de esfuerzo;)).
fuente
readme.txt
y lo hace ejecutable. Si el usuario lo ejecutó, no abre el editor, pero ejecuta el código. En este sentido, hacer que las extensiones importen (pero no ocultarlas) es más seguro y más fácil de explicar para los usuarios no conocedores. Existen otras diferencias (sobre todo no ejecutar archivos desde el directorio actual), pero no tienen nada que ver con las extensiones.readme.txt
archivo con un editor de texto. Acabo de probar con dolphin en KDE, creando un script de shell que agrega permiso ejecutable, guardándolo como.txt
y haciendo clic en él lo abrirá en Kate. Si le cambio el nombre,.sh
entonces al hacer clic en él lo ejecuta.file
está basado en heurística, no está definido.No hay una respuesta 100% en blanco o negro aquí.
Por lo general, Linux no se basa en nombres de archivo (y extensiones de archivo, es decir, la parte del nombre del archivo después del último período normalmente) y en su lugar determina el tipo de archivo examinando los primeros bytes de su contenido y comparándolo con una lista de números mágicos conocidos .
Por ejemplo, todos los archivos de imagen de mapa de bits (generalmente con extensión de nombre
.bmp
) deben comenzar con las letrasBM
en sus dos primeros bytes. Las secuencias de comandos en la mayoría de los lenguajes de secuencias de comandos como Bash, Python, Perl, AWK, etc. (básicamente todo lo que trata las líneas que comienzan con un#
comentario) pueden contener un shebang#!/bin/bash
como primera línea. Este comentario especial le dice al sistema con qué aplicación abrir el archivo.Entonces, normalmente el sistema operativo se basa en el contenido del archivo y no en su nombre para determinar el tipo de archivo, pero declarar que las extensiones de archivo nunca son necesarias en Linux es solo la mitad de la verdad.
Por supuesto, las aplicaciones pueden implementar sus comprobaciones de archivos como quieran, lo que incluye verificar el nombre y la extensión del archivo. Un ejemplo es el Eye of Gnome (
eog
visor de imágenes estándar) que determina el formato de imagen por la extensión del archivo y genera un error si no coincide con el contenido. Se puede discutir si esto es un error o una característica ...Sin embargo, incluso algunas partes del sistema operativo dependen de las extensiones de nombre de archivo, por ejemplo, al analizar los archivos de origen de su software
/etc/apt/sources.list.d/
, solo los archivos con la*.list
extensión se analizan; todos los demás se ignoran. Quizás no se usa principalmente para determinar el tipo de archivo aquí, sino para habilitar / deshabilitar el análisis de algunos archivos, pero sigue siendo una extensión de archivo que afecta la forma en que el sistema trata un archivo.Y, por supuesto, los beneficios de los usuarios humanos más de extensiones de archivo que eso hace que el tipo de un archivo obvio y también permite que varios archivos con el mismo nombre base y diferentes extensiones como
site.html
,site.php
,site.js
,site.css
extensión, etc. La desventaja es, por supuesto, ese archivo y lo actual el tipo / contenido de archivo no necesariamente tiene que coincidir.Además, es necesario para la interoperabilidad entre plataformas, ya que, por ejemplo, Windows no sabrá qué hacer con un
readme
archivo, sino solo areadme.txt
.fuente
#!
. Todo lo demás depende de la decisión de algunas aplicaciones."eog
y no sé por qué les importa el nombre del archivo. Esto es un error en mi opinión. Y, por supuesto, si el archivo se llama "bmp" pero su formato de contenido no coincide, también habrá un error, por supuesto. Por supuesto, cada aplicación decide cómo verificar los archivos, pero en general las aplicaciones de Linux no deberían depender del nombre. Por cierto, puede usar lafile
recomendación para examinar los tipos de archivo por su contenido.file
utilidad realmente no prueba nada; Es una herramienta útil, que podría existir en cualquier sistema operativo. ¿Qué parte fundamental del sistema operativo hace que la ejecuciónfile
sea más "correcta" que bloquear el nombre del archivo?Como mencionan otros, en Linux se usa un método de directiva de intérprete (almacenar algunos metadatos en un archivo como encabezado o número mágico para que se le diga al intérprete correcto que lo lea) en lugar del método de asociación de extensión de nombre de archivo utilizado por Windows.
Esto significa que puede crear un archivo con casi cualquier nombre que desee ... con algunas excepciones
sin embargo
Me gustaría agregar una palabra de precaución.
Si tiene algunos archivos en su sistema de un sistema que usa asociación de nombre de archivo, es posible que los archivos no tengan esos números mágicos o encabezados. Las extensiones de nombre de archivo se usan para identificar estos archivos por aplicaciones que pueden leerlos, y puede experimentar algunos efectos inesperados si cambia el nombre de dichos archivos. Por ejemplo:
Si cambia el nombre de un archivo
My Novel.doc
aMy-Novel
, Libreoffice aún podrá abrirlo, pero se abrirá como 'Sin título' y tendrá que volver a nombrarlo para guardarlo (Libreoffice agrega una extensión de forma predeterminada, por lo que entonces tendrá dos archivosMy-Novel
yMy-Novel.odt
, lo que podría ser molesto)Más en serio, si cambia el nombre de un archivo My Spreadsheet.xlsx a My-Spreadsheet, intente abrirlo y
xdg-open My-Spreadsheet
obtendrá esto (porque en realidad es un archivo comprimido):Y si cambia el nombre de un archivo
My Spreadsheet.xls
aMy-Spreadsheet
, cuandoxdg-open My-Spreadsheet
recibe un error que dice(Aunque en ambos casos funciona bien si lo haces
soffice My-Spreadsheet
)Si a continuación, cambia el nombre del archivo sin extensión a
My-Spreadsheet.ods
lamv
e intenta abrirlo obtendrá la siguiente:(la reparación falla)
Y tendrá que volver a colocar la extensión original para abrir el archivo correctamente (luego puede convertir el formato si lo desea)
TL; DR:
Si tiene archivos no nativos con extensiones de nombre, ¡no elimine las extensiones suponiendo que todo estará bien!
fuente
Me gustaría adoptar un enfoque diferente de otras respuestas, y desafiar la noción de que "Linux" o "Windows" tienen algo que ver con esto (tengan paciencia conmigo).
El concepto de una extensión de archivo puede expresarse simplemente como "una convención para identificar el tipo de archivo basado en parte de su nombre". Las otras convenciones comunes para identificar el tipo de archivo son comparar su contenido con una base de datos de firmas conocidas (el enfoque de "número mágico") y almacenarlo como un atributo adicional en el sistema de archivos (el enfoque utilizado en el MacOS original) .
Dado que cada archivo en un sistema Windows o Linux tiene tanto un nombre como contenido, los procesos que desean conocer el tipo de archivo pueden usar los enfoques de "extensión" o "número mágico" como lo consideren conveniente. El enfoque de metadatos generalmente no está disponible, ya que no existe un lugar estándar para este atributo en la mayoría de los sistemas de archivos.
En Windows, existe una fuerte tradición de usar la extensión de archivo como el medio principal para identificar un archivo; Lo más visible es que el explorador de archivos gráficos (Administrador de archivos en Windows 3.1 y Explorer en Windows moderno) lo utiliza cuando hace doble clic en un archivo para determinar qué aplicación iniciar. En Linux (y, más generalmente, sistemas basados en Unix), hay más tradición para inspeccionar los contenidos; más notablemente, el núcleo mira al principio de un archivo ejecutado directamente para determinar cómo ejecutarlo; los archivos de script pueden indicar un intérprete para usar comenzando por
#!
seguido de la ruta al intérprete.Estas tradiciones influyen en el diseño de la interfaz de usuario de los programas escritos para cada sistema, pero hay muchas excepciones, porque cada enfoque tiene ventajas y desventajas en diferentes situaciones. Las razones para usar extensiones de archivo en lugar de examinar los contenidos incluyen:
Ejemplos de programas de Linux que usan nombres de archivos de forma predeterminada (pero pueden tener otros modos):
fuente
#!
al principio. Cualquier archivo con su conjunto de bits ejecutables puede ejecutarse de una de varias maneras.#!/bin/bash
y firmas similares solo especifican qué intérprete usar. Si no se proporciona dicha firma, se supone el intérprete de shell predeterminado. Un archivo que no contenga más que las dos palabras 'Hola Mundo', pero con su bit de ejecución establecido, intentará encontrar un comando 'Hola' cuando se ejecute.En realidad, algunas tecnologías no depender de extensiones de archivo, así que si usa esas tecnologías en Ubuntu, tendrá que depender de extensiones también. Algunos ejemplos:
gcc
usa extensiones para distinguir entre archivos C y C ++. Sin la extensión es prácticamente imposible diferenciarlos (imagine un archivo C ++ sin clases).docx
,jar
,apk
) sólo están estructurados en especial archivos ZIP. Si bien generalmente puede inferir el tipo del contenido, puede que no siempre sea posible (por ejemplo, Java Manifest es opcional en losjar
archivos).No usar extensiones de archivo en tales casos solo será posible con soluciones alternativas y es probable que sea muy propenso a errores.
fuente
gcc
es el front-end para archivos C, para archivos C ++ necesita elg++
front-end o un interruptor de línea de comandos para especificar el idioma. Más importante es elmake
programa que decide si usargcc
og++
construir un archivo en particular, ymake
depende completamente de los patrones de nombre de archivo (principalmente extensiones) para su coincidencia de reglas..cc
extensióngcc
, realmente se compilará como C ++, y esto se documenta enman gcc
: "Para cualquier archivo de entrada dado, el sufijo del nombre de archivo determina qué tipo de compilación se realiza:" seguido de una lista de extensiones y cómo se tratan.make
es un buen ejemplo, perogcc
depende en gran medida de los nombres de archivo. Aquí hay un ejemplo más claro que.c
vs.cc
: para C,gcc
usa sufijos para saber si su primer paso es preprocesar (.c
), compilar (.i
), ensamblar (.s
) o enlazar (.o
). Aquí, yo uso-E
,-S
y-c
que le digagcc
dónde parar , pero utiliza nombres de archivo que saber dónde comenzar .gcc something.cc
No se vinculará a las bibliotecas adecuadas para C ++ pero será tratar el archivo como C ++, por lo que muchos usuarios están confundidos por los mensajes de error que obtienen al hacer ese error.Su primera suposición es correcta: las extensiones en Linux no importan y solo son útiles para los humanos (y otros sistemas operativos que no son de Unix que se preocupan por las extensiones). El tipo de un archivo está determinado por los primeros 32 bits de datos en el archivo, lo que se conoce como número mágico. Esta es la razón por la cual los scripts de shell necesitan
#!
línea, para indicarle al sistema operativo qué intérprete debe llamar. Sin él, el script de shell es solo un archivo de texto.En lo que respecta a los administradores de archivos, quieren conocer las extensiones de algunos archivos, como los
.desktop
archivos, que básicamente son lo mismo que la versión de Windows de los accesos directos, pero con más capacidades. Pero en lo que respecta al sistema operativo, necesita saber qué hay en el archivo, no qué hay en su nombre.fuente
gunzip
que no descomprimirá un archivo si no se llamafoo.gz
.gunzip
Es un ejemplo,eog
es otro. Además, muchas herramientas no completarán automáticamente los nombres sin la extensión correcta. Todo lo que digo es que es un poco más complicado que "las extensiones siempre son irrelevantes".Esta es una respuesta demasiado grande para un comentario.
Tenga en cuenta que incluso "extensión" tiene muchos significados diferentes.
De lo que estás hablando parecen ser las 3 letras después del. DOS hizo que el formato 8.3 fuera realmente popular y Windows usa la parte .3 hasta el día de hoy.
Linux tiene muchos archivos como .conf o .list o .d o .c que tienen significado, pero en realidad no son extensiones en el sentido 8.3. Por ejemplo, Apache mira /etc/apache2/sites-enabled/website.conf para su directiva de configuración. Si bien el sistema usa Tipos MIME y encabezados de contenido y qué no determinar si es un archivo de texto, Apache (por defecto) todavía no lo cargará sin que termine en .conf.
.c es otro excelente. Sí, es un archivo de texto, pero gcc depende de que main.c se convierta en main.o y finalmente en main (después del enlace). En ningún momento el sistema usa la extensión .c, .o o no para tener ningún significado en cuanto al contenido, pero las cosas después de. Tiene algún significado. Probablemente configuraría su SCM para ignorar main.o y main.
El punto es este: las extensiones no se usan de la misma manera que en Windows. El núcleo no ejecutará un archivo .txt porque elimina la parte .txt del nombre. También es muy feliz ejecutar un archivo .txt si se establece el permiso de ejecución. Dicho esto, tienen significado y todavía se usan en un "nivel de computadora" para muchas cosas.
fuente
x.3
estructura de nombres todas las extensiones más largas más, usted ha llegado hasta allí, así como.doxc
,.torrent
,.part
, etc. Es sólo que muchos formatos de archivo y extensiones fueron ya definido de nuevo en el momento en nomenclatura 8.3 seguía siendo una cosa y luego los formatos en su mayoría simplemente adaptaron la convención de usar hasta 3 letras.gzip
su Makefile, etc.) pueden escribirse para usar esta convención para hacer suposiciones sobre la acción correcta que se debe realizar en cada archivo.dir
en un símbolo del sistema no me dirá tal cosa; simplemente no le importará. La ejecución de archivos es ciertamente una excepción, en ambos sistemas operativos; si la pregunta se limitara a esas, la respuesta sería que DOS / Windows solo se preocupan por el nombre, y Unix / Linux solo se preocupa por el permiso de ejecución y los primeros bytes del archivo. Fuera de eso, siempre hay alguna aplicación que elige una convención a seguir.