Commande de fichiers Linux classant les fichiers

17

J'ai besoin de reconnaître le type de données contenues dans des fichiers aléatoires. Je suis nouveau sur Linux.

Je prévois d'utiliser la filecommande pour comprendre quel type de données contient un fichier. J'ai essayé cette commande et obtenu la sortie ci-dessous.

Quelqu'un m'a suggéré que la filecommande examine les octets initiaux d'un fichier pour déterminer le type de données. La filecommande ne regarde pas du tout une extension de fichier. Est-ce exact? J'ai regardé la page de manuel mais j'ai trouvé que c'était trop technique. J'apprécierais que quelqu'un puisse fournir un lien qui a une explication beaucoup plus simple concernant le fonctionnement de la filecommande.

Quelles sont les différentes réponses possibles que je pourrais obtenir après avoir exécuté la filecommande? Par exemple, dans la transcription ci-dessous, j'obtiens JPEG, support ISO, ASCII, etc.:

La sortie d'écran est la suivante

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


Mise à jour 1

Merci pour les réponses et ils ont clarifié certaines choses pour moi.

Donc, si je comprends bien, le dossier / usr / share / mime / magic a une base de données qui me donnera quels sont les formats de fichiers actuels possibles (sorties que je peux obtenir lorsque je tape la commande file et la suit par un fichier). Est-ce exact? Est-il vrai que chaque fois que la sortie de la commande "Fichier" contient le mot "texte", cela fait référence à quelque chose que vous pouvez lire avec une visionneuse de texte, et tout ce qui sans "texte" est une sorte de binaire?

user2543622
la source
6
À l'avenir, la publication d'une image de la sortie du terminal n'est vraiment pas recommandée (ou appréciée par quiconque). Utilisez la mise en forme du bloc de code de démarque.
HalosGhost
3
J'ai supprimé la photo et publié le code.
user2543622
Juste une remarque: si un fichier ne peut pas identifier un fichier, souvent TrID le peut. il possède sa propre base de données des caractéristiques des fichiers, créée par la communauté qui l'utilise.
Josef dit Réintégrer Monica le

Réponses:

13

file utilise plusieurs types de tests :

1: Si le fichier n'existe pas, ne peut pas être lu ou si son état n'a pas pu être déterminé, la sortie doit indiquer que le fichier a été traité, mais que son type n'a pas pu être déterminé.

Ce sera sorti comme cannot open file: No such file or directory.

2: Si le fichier n'est pas un fichier normal, son type de fichier doit être identifié. Le répertoire des types de fichiers, FIFO, socket, spécial bloc et caractère spécial doit être identifié comme tel. D'autres types de fichiers définis par l'implémentation peuvent également être identifiés. Si le fichier est un lien symbolique, par défaut le lien doit être résolu et le fichier doit tester le type de fichier référencé par le lien symbolique. (Voir les options -het -ici-dessous.)

Ce sera produit comme .: directoryet /dev/sda: block special. Une grande partie du format pour cela et le point précédent est partiellement défini par POSIX - vous pouvez compter sur certaines chaînes dans la sortie.

3: Si la longueur du fichier est nulle, il doit être identifié comme un fichier vide.

C'est ça foo: empty.

4: L'utilitaire de fichier doit examiner un segment initial du fichier et doit deviner l'identification de son contenu sur la base de tests sensibles à la position. (La réponse n'est pas garantie d'être correcte; voir les options -d, -M et -m ci-dessous.)

5: L'utilitaire de fichier doit examiner le fichier et faire une supposition pour identifier son contenu en fonction des tests système par défaut contextuels. (La réponse n'est pas garantie d'être correcte.)

Ces deux utilisent l' identification par numéro magique et sont la partie la plus intéressante de la commande. Un nombre magique est une séquence spéciale d'octets qui se trouve à un endroit connu dans un fichier qui identifie son type. Traditionnellement, cet endroit est les deux premiers octets, mais le terme a été étendu pour inclure des chaînes plus longues et d'autres emplacements. Voir cette autre question pour plus de détails sur les nombres magiques dans la filecommande.

La filecommande a une base de données de ces numéros et à quel type ils correspondent; cette base de données se trouve généralement dans /usr/share/mime/magicet mappe le contenu du fichier aux types MIME . La sortie là-bas (souvent file -isi vous ne l'obtenez pas par défaut) sera un type de média défini ou une extension. Les "tests contextuels" utilisent le même type d'approche, mais sont un peu plus flous. Rien de tout cela n'est garanti, mais ils sont censés être de bonnes suppositions.

filepossède également une base de données mappant ces types à des noms, par laquelle il saura qu'un fichier qu'il a identifié comme application/pdfpouvant être décrit comme un PDF document. Ces noms lisibles par l'homme peuvent également être localisés dans une autre langue. Ce sera toujours une description de haut niveau du type de fichier d'une manière qu'une personne comprendra, plutôt qu'une machine.

La majorité des sorties différentes que vous pouvez obtenir proviendront de ces étapes. Vous pouvez consulter le magicfichier pour une liste des types pris en charge et comment ils sont identifiés - mon système connaît 376 types différents. Les noms donnés et les types pris en charge sont déterminés par la configuration et la configuration de votre système. Par conséquent, votre système peut prendre en charge plus ou moins que le mien, mais il y en a généralement beaucoup. libmagiccontient également des tests codés en dur supplémentaires.

6: Le fichier doit être identifié comme un fichier de données.

C'est foo: dataquand il n'a pas réussi à comprendre quoi que ce soit sur le fichier.

Il existe également d'autres petites balises qui peuvent apparaître. Un fichier exécutable ( +x) inclura " executable" dans la sortie, généralement séparé par des virgules. L' fileimplémentation peut également connaître des choses supplémentaires sur certains formats de fichiers pour pouvoir décrire des points supplémentaires à leur sujet, comme dans votre " PDF document, version 1.4".

Michael Homer
la source
8

Les pages de manuel sont généralement des références laconiques, pas des introductions. Commencez avec la page Wikipedia .

filene regarde que le contenu du fichier, pas le nom du fichier. (Il examine également certaines métadonnées de fichier telles que le type de fichier: répertoire, lien symbolique, canal nommé, etc. Mais dans les cas qui vous intéressent, c'est le contenu qui compte.)

filedevine généralement le format d'un fichier en regardant les premiers octets et en les comparant avec une table intégrée de nombres magiques . Par exemple, si le fichier commence par %PDF, puis filesignale «document PDF» (et va plus loin pour rapporter la version minimale). Pour les types de fichiers qui ne commencent pas par des nombres magiques, il contient des heuristiques, par exemple, rapportez du «texte ASCII» si les premiers octets sont tous dans la plage ASCII imprimable.

La sortie de fileest fragile: elle peut varier d'une variante unix à une variante unix et d'une version à l'autre. Sous Linux, Cygwin et * BSD, la filecommande prend en charge une option -iqui produit une sortie prévisible sous la forme d'un type de média MIME (l'IANA gère la liste des types de média standard ). Il n'y a pas autant de détails et la sortie est moins conviviale pour l'homme, mais la sortie est prévisible et conviviale pour l'ordinateur.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

À utiliser file --mime-typesi vous souhaitez uniquement le type MIME lui-même sans coder les informations, par exemple application/pdf. Passez l'option -bsi vous ne souhaitez pas afficher le nom du fichier au début de la ligne.

Gilles 'SO- arrête d'être méchant'
la source
5

J'aimerais que vous lisiez la réponse d' ici . Certains extraits de la réponse sont:

À partir de la page de manuel de file commande,

file La commande effectue en fait 3 tests pour déterminer le type de fichier.

Premier test

Les tests du système de fichiers sont basés sur l'examen du retour d'un appel système stat (2).

Deuxième test

Les tests de nombres magiques sont utilisés pour vérifier les fichiers contenant des données dans des formats fixes particuliers.

Troisième test

Les tests de langue recherchent des chaînes particulières (cf names.h) qui peuvent apparaître n'importe où dans les premiers blocs d'un fichier. Par exemple, le mot clé .br indique que le fichier est très probablement un fichier d'entrée troff (1), tout comme le mot clé struct indique un programme C.

La sortie du file commande est généralement basée sur le résultat de l'un des tests qui réussit.

Maintenant, en supposant que le programme C ++ démarre comme ceci et que le troisième test réussit,

#include <iostream.h>
bla
bla

Selon le troisième test, le mot clé #includespécifie en particulier qu'il s'agit d' un programme de type C bien que nous ayons un programme CPP en main. Maintenant, quand je vérifie,

$ file example.cpp

example.cpp: ASCII C program text

Maintenant, les concepts orientés objet sont spécifiques au C ++. Créons un fichier spécifique à C ++ .

Je démarre mon programme C ++ comme,

Class something
{
}
bla
bla

Maintenant, quand j'émets

$ file example.cpp

La sortie est,

example.cpp: ASCII C++ program text

Cela explique essentiellement le fonctionnement de la filecommande sur des fichiers similaires (dans cet exemple, le programme C et le programme C ++ sont traités de la même manière à moins que nous n'utilisions les fonctionnalités orientées objet spécifiques à C ++).

Ramesh
la source
1

Gilles et Michael Homer ont fourni d'excellentes réponses. auquel je vous réfère. Pour voir les types de fichiers reconnus sur votre système, essayez d'exécuter

cat /usr/share/magic

Si cela donne des problèmes d'autorisation, ou n'existe pas, alors peut-être

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(peut nécessiter des ajustements selon votre système) qui devrait vous montrer une liste des types de fichiers sur votre système. Cette commande peut prendre un certain temps à s'exécuter en fonction de la taille de votre système de fichiers racine.

Warwick
la source