web-dev-qa-db-fra.com

Les extensions de fichier ont-elles une utilité (pour le système d'exploitation)?

Linux détermine le type d'un fichier via un code dans l'en-tête du fichier. Cela ne dépend pas des extensions de fichier pour savoir quel logiciel utiliser pour ouvrir le fichier.

C'est ce que je me souviens de mon éducation. S'il vous plaît, corrigez-moi si je me trompe!

Travailler un peu avec les systèmes Ubuntu récemment: je vois beaucoup de fichiers sur les systèmes qui ont des extensions telles que .sh, .txt, .o, .c

Maintenant, je me demande: ces extensions sont-elles destinées uniquement aux humains? Alors qu’on devrait avoir une idée de quel type de fichier il s’agit?

Ou ont-ils également une utilité pour le système d'exploitation?

73
mizech

Linux détermine le type d'un fichier via un code dans l'en-tête du fichier. Cela ne dépend pas des extensions de fichier pour savoir avec le logiciel est d'utiliser pour ouvrir le fichier.

C'est ce que je me souviens de mon éducation. S'il vous plaît, corrigez-moi si je me trompe!

  • correctement rappelé.

Ces extensions sont-elles destinées uniquement aux humains?

  • Oui, avec un mais.

Lorsque vous interagissez avec d'autres systèmes d'exploitation qui dépendent des extensions, il est plus judicieux de les utiliser.

Sous Windows, le logiciel d’ouverture est associé aux extensions.

L'ouverture d'un fichier texte nommé "fichier" est plus difficile sous Windows que d'ouvrir le même fichier nommé "fichier.txt" (vous devrez changer la boîte de dialogue d'ouverture de fichier de *.txt à *.* à chaque fois). Il en va de même pour les fichiers texte séparés par des tabulations et des tabulations. Il en va de même pour l'importation et l'exportation d'e-mails (extension .mbox).

En particulier lorsque vous codez un logiciel. Ouvrir un fichier nommé "software1" qui est un fichier HTML et "software2" qui est un fichier JavaScript devient plus difficile comparé à "software.html" et "software.js".


S'il existe un système sous Linux dans lequel les extensions de fichier sont importantes, j'appellerais cela un bogue. Lorsque le logiciel dépend des extensions de fichier, cela est exploitable. Nous utilisons une directive interpréteur pour identifier ce qu'est un fichier ("les deux premiers octets d'un fichier peuvent être les caractères" #! ", Qui constituent un nombre magique (hexadécimal 23 et 21, le ASCII valeurs de "#" et "!") Souvent désignées par Shebang, ").

Le problème le plus connu concernant les extensions de fichier était LOVE-LETTER-FOR-YOU.TXT.vbs sous Windows. Il s'agit d'un script visuel basique affiché dans l'explorateur de fichiers sous forme de fichier texte.

Dans Ubuntu, lorsque vous démarrez un fichier à partir de Nautilus, vous recevez un avertissement indiquant ce qu'il va faire. Exécuter un script de Nautilus où il veut démarrer un logiciel où il est supposé ouvrir gEdit est un problème évident et nous recevons un avertissement à ce sujet.

En ligne de commande, lorsque vous exécutez quelque chose, vous pouvez voir visuellement quelle est l'extension. Si cela finissait avec .vbs, je deviendrais méfiant (pas que .vbs soit exécutable sous Linux. Du moins sans un effort supplémentaire;)).

39
Rinzwind

Il n'y a pas de réponse à 100% en noir ou blanc ici.

Habituellement Linux ne dépend pas des noms de fichiers (ni de ses extensions, c’est-à-dire de la partie du nom de fichier après la dernière période) et détermine le type de fichier en examiner les premiers octets de son contenu et comparer celui-ci à une liste de nombres magiques connus .

Par exemple, tous les fichiers image Bitmap (généralement avec l'extension de nom .bmp) doivent commencer par les lettres BMdans leurs deux premiers octets. Les scripts dans la plupart des langages de script tels que Bash, Python, Perl, AWK, etc. (essentiellement tout ce qui traite les lignes commençant par # comme commentaire) peuvent contenir un Shebang comme #!/bin/bash en première ligne. Ce commentaire spécial indique au système avec quelle application ouvrir le fichier.

Donc, normalement, le système d’exploitation s’appuie sur le contenu du fichier et non sur son nom pour déterminer le type de fichier, mais le fait de déclarer que les extensions de fichier ne sont jamais nécessaires sous Linux n’est que la moitié de la vérité.


Les applications peuvent bien sûr implémenter leurs contrôles de fichiers comme bon leur semble, ce qui inclut la vérification du nom du fichier et de son extension. Un exemple est l’Œil de Gnome (eogname__, visualiseur d’images standard) qui détermine le format d’image par l’extension du fichier et génère une erreur s’il ne correspond pas au contenu. Que ce soit un bug ou une fonctionnalité peut être discuté ...

Cependant, même certaines parties du système d'exploitation reposent sur des extensions de nom de fichier, par exemple. lors de l'analyse de vos fichiers sources de logiciels dans /etc/apt/sources.list.d/ - seuls les fichiers portant l'extension *.list sont analysés, tous les autres sont ignorés. Ce n'est peut-être pas principalement utilisé pour déterminer le type de fichier ici, mais plutôt pour activer/désactiver l'analyse de certains fichiers, mais c'est toujours une extension de fichier qui affecte la façon dont le système traite un fichier.

Et bien sûr, l’utilisateur humain profite au maximum des extensions de fichier car cela rend le type de fichier évident et autorise également plusieurs fichiers portant le même nom de base et différentes extensions telles que site.html, site.php, site.js, site.css etc. etc. L’inconvénient est bien sûr que ce fichier extension et le type de fichier/contenu ne doivent pas nécessairement correspondre.

De plus, il est nécessaire pour l'interopérabilité entre plates-formes, comme par exemple. Windows ne saura pas quoi faire avec un fichier readmename__, mais seulement un readme.txt.

68
Byte Commander

Comme mentionné par d’autres, sous Linux, une méthode de directive interpréteur est utilisée (stockant certaines métadonnées dans un fichier sous forme d’en-tête ou de nombre magique afin que l’interprète correct puisse le lire) plutôt que la méthode d’association d’extension de nom de fichier utilisée par Windows.

Cela signifie que vous pouvez créer un fichier avec presque n'importe quel nom ... à quelques exceptions près

Toutefois

Je voudrais ajouter un mot de prudence.

Si votre système contient des fichiers provenant d'un système utilisant l'association de nom de fichier, il est possible que ces fichiers ne possèdent pas ces numéros ou en-têtes magiques. Les extensions de nom de fichier sont utilisées pour identifier ces fichiers par les applications capables de les lire, et vous pouvez rencontrer des effets inattendus si vous renommez ces fichiers. Par exemple:

Si vous renommez un fichier My Novel.doc en My-Novel, Libreoffice pourra toujours l'ouvrir, mais il s'ouvrira sous le nom 'Untitled' et vous devrez le nommer à nouveau pour le sauvegarder (Libreoffice ajoute une extension par défaut afin de puis avoir deux fichiers My-Novel et My-Novel.odt, ce qui pourrait être gênant)

Plus sérieusement, si vous renommez un fichier My Spreadsheet.xlsx en My-Spreadsheet, puis essayez de l'ouvrir avec xdg-open My-Spreadsheet, vous obtiendrez ceci (car il s'agit en fait d'un fichier compressé):

Et si vous renommez un fichier My Spreadsheet.xls en My-Spreadsheet, lorsque vous xdg-open My-Spreadsheet vous obtenez une erreur disant

erreur d'ouverture du site: aucune application n'est enregistrée pour gérer ce fichier

(Bien que dans les deux cas, cela fonctionne bien si vous faites soffice My-Spreadsheet)

Si vous renommez ensuite le fichier sans extension en My-Spreadsheet.ods avec mv et essayez de l'ouvrir, vous obtiendrez ceci:

(la réparation échoue)

Et vous devrez remettre l'extension d'origine pour ouvrir le fichier correctement (vous pouvez ensuite convertir le format si vous le souhaitez)

TL; DR:

Si vous avez des fichiers non natifs avec des extensions de nom, ne supprimez pas les extensions en supposant que tout ira bien!

24
Zanna

J'aimerais aborder cette question d'une manière différente des autres réponses et contester la notion selon laquelle "Linux" ou "Windows" a tout à voir avec cela (supportez-moi).

Le concept d'extension de fichier peut être simplement exprimé comme "une convention permettant d'identifier le type d'un fichier en fonction d'une partie de son nom". Les autres conventions courantes pour identifier le type d'un fichier comparent son contenu à une base de données de signatures connues (approche "nombre magique") et le stockent en tant qu'attribut supplémentaire sur le système de fichiers (approche utilisée dans le MacOS d'origine). .

Comme chaque fichier sur un système Windows ou Linux a à la fois un nom et un contenu, les processus qui souhaitent connaître le type de fichier peuvent utiliser l'approche "extension" ou "nombre magique" comme bon leur semble. L’approche par métadonnées n’est généralement pas disponible, car il n’existe pas d’emplacement standard pour cet attribut sur la plupart des systèmes de fichiers.

Sous Windows, il est de tradition d'utiliser l'extension de fichier comme principal moyen d'identification d'un fichier. de manière très visible, le navigateur de fichiers graphique (Gestionnaire de fichiers sous Windows 3.1 et Explorer sous Windows moderne) l’utilise lorsque vous double-cliquez sur un fichier pour déterminer l’application à lancer. Sur Linux (et plus généralement sur les systèmes Unix), il est de plus en plus courant d’inspecter le contenu; en particulier, le noyau examine le début d'un fichier exécuté directement pour déterminer comment l'exécuter. Les fichiers de script peuvent indiquer un interpréteur à utiliser en commençant par #! suivi du chemin d'accès à l'interpréteur.

Ces traditions influencent la conception des programmes écrits pour chaque système par l'interface utilisateur, mais il existe de nombreuses exceptions, car chaque approche présente des avantages et des inconvénients dans des situations différentes. Les raisons d'utiliser les extensions de fichier plutôt que d'examiner le contenu incluent:

  • l’examen du contenu des fichiers est assez coûteux par rapport à l’examen des noms de fichiers; Ainsi, par exemple, "rechercher tous les fichiers nommés * .conf" sera beaucoup plus rapide que "rechercher tous les fichiers dont la première ligne correspond à cette signature".
  • le contenu du fichier peut être ambigu; de nombreux formats de fichiers ne sont en réalité que des fichiers texte traités de manière particulière, de nombreux autres sont des fichiers Zip spécialement structurés, et définir des signatures précises peut être délicat
  • un fichier peut véritablement être valide en plusieurs types; un fichier HTML peut également être un fichier XML valide, un fichier Zip et un fichier GIF concaténés restent valables pour les deux formats
  • la correspondance du nombre magique pourrait conduire à de faux positifs; un format de fichier sans en-tête peut commencer par les octets "GIF89a" et être identifié à tort comme une image GIF
  • renommer un fichier peut être un moyen pratique de le marquer comme "désactivé"; par exemple. changer "foo.conf" en "foo.conf ~" pour indiquer qu'une sauvegarde est plus facile que de modifier le fichier pour mettre en commentaire toutes ses directives, et plus pratique que de le sortir d'un répertoire chargé automatiquement; De même, renommer un fichier .php en .txt indiquera à Apache de servir sa source sous forme de texte brut, plutôt que de le transmettre au moteur PHP.

Exemples de programmes Linux qui utilisent les noms de fichiers par défaut (mais peuvent avoir d’autres modes):

  • gzip et gunzip ont une gestion spéciale de tout fichier se terminant par ".gz"
  • gcc gérera les fichiers ".c" en C, et ".cc" ou ".C" en C++
20
IMSoP

En fait, certaines technologies dépendent des extensions de fichiers. Par conséquent, si vous utilisez ces technologies dans Ubuntu, vous devrez également compter sur des extensions. Quelques exemples:

  • gccutilise des extensions pour faire la distinction entre les fichiers C et C++. Sans l'extension, il est pratiquement impossible de les différencier (imaginez un fichier C++ sans classes).
  • de nombreux fichiers (docxname__, jarname__, apkname__) sont des archives Zip particulièrement structurées. Bien que vous puissiez généralement déduire le type du contenu, il se peut que ce ne soit pas toujours possible (par exemple, Java Le manifeste est facultatif dans les fichiers jarname__).

Ne pas utiliser d'extensions de fichier dans de tels cas ne sera possible qu'avec des solutions de contournement de hacky et sera probablement très sujet aux erreurs.

15
Dmitry Grigoryev

Votre première hypothèse est correcte: les extensions sous Linux n’importent pas et ne sont utiles que pour les humains (et les autres systèmes d’exploitation non apparentés à Unix qui s’occupent des extensions). Le type d'un fichier est déterminé par les 32 premiers bits de données qu'il contient, appelé nombre magique C'est pourquoi les scripts Shell ont besoin de #! line - pour indiquer au système d'exploitation quel interpréteur doit être appelé. Sans cela, le script Shell n'est qu'un fichier texte.

En ce qui concerne les gestionnaires de fichiers, ils souhaitent connaître les extensions de certains fichiers, tels que les fichiers .desktop, qui sont essentiellement identiques à la version de Windows des raccourcis mais avec davantage de fonctionnalités. Mais en ce qui concerne le système d’exploitation, il doit savoir ce qui est dans le fichier, pas ce qui est dans son nom.

7
Sergiy Kolodyazhnyy

C'est trop gros pour une réponse de commentaire.

Gardez à l'esprit que même "extension" a beaucoup si différentes significations.

Ce que vous parlez semble être les 3 lettres après le. DOS a rendu le format 8.3 très populaire et Windows utilise la partie .3 à ce jour.

Linux a beaucoup de fichiers comme .conf ou .list ou .d ou .c qui ont une signification, mais ne sont pas vraiment des extensions au sens 8.3. Par exemple, Apache examine /etc/Apache2/sites-enabled/website.conf pour connaître sa directive de configuration. Bien que le système utilise les types MIME et les en-têtes de contenu pour ne pas déterminer qu'il s'agit d'un fichier texte, Apache (par défaut) ne le charge toujours pas sans se terminer par .conf.

.c est un autre excellent. Oui, c'est un fichier texte, mais gcc dépend de main.c qui devient main.o et enfin principal (après avoir lié). À aucun moment, le système n’utilise l’extension .c, .o ou no pour donner un sens quelconque au contenu mais aux éléments suivants. a une signification. Vous devriez probablement configurer votre SCM pour ignorer main.o et main.

Voici le point: les extensions ne sont pas utilisées telles quelles dans les fenêtres. Le noyau n'exécutera pas de fichier .txt car vous supprimez la partie .txt du nom. Il est également très heureux d'exécuter un fichier .txt si l'autorisation d'exécution est définie. Cela étant dit, ils ont un sens et sont encore utilisés au "niveau informatique" pour beaucoup de choses.

6
coteyr