Come fa Linux a identificare i tipi di file senza estensioni? E perché Windows non può farlo?

Linux non necessariamente identifica i tipi di file senza estensioni. E nemmeno Windows si basa sulle estensioni come si potrebbe pensare. Cominciamo dal nucleo. (Uso la parola Linux e Unix in modo intercambiabile perché molte delle cose che vedete in Linux provengono dall'eredità BSD dei Bell Labs.)

A livello fondamentale, Unix ha preso una decisione MOLTO LUNGA tempo fa, di fornire una rappresentazione dei file per quanta più "roba" possibile. Lista dei processi in corso? File. Tubi? File. Prese del kernel? File. Informazioni sulla memoria? File. Dispositivi a blocchi? File. Directory? File. Dispositivi Usb? File. Porta seriale? File.

Questo significava che per un sacco di situazioni, i *nix iniziavano con molti più metadati attribuibili a un file (molto più di quello che Windows supportava originariamente - NT ha risolto molto di questo.)

Questo combinato con il fatto che nei primi giorni di sviluppo di Linux non avevano il tempo di scrivere strumenti complessi/di fantasia, e la filosofia unix di riutilizzare piccoli strumenti ripetutamente, significava che la maggior parte dei file erano leggibili dalla macchina (aka, ASCII text-based.) Il fatto che non c'era nulla di "proprietario" da nascondere e che non c'erano promozioni da guadagnare inventando nuovi formati di file nelle proprie "org" ha incentivato questo ancora di più.

Questo ha significato che un sacco di file in Linux sono semplicemente basati sul testo. Questo non significa che si può "dire" magicamente un tipo di file per tutto il tempo. Solo perché qualcosa è ASCII non significa che sia lo stesso "tipo". Per esempio, se andate sotto /etc/ ci sono molti file di configurazione che sono di "tipo" file di configurazione. Ma cosa significa? Ogni file ha un formato diverso, una sintassi diversa. Un gran numero di file sono semplicemente dedotti intuitivamente dalla loro posizione o dal loro nome (il programma pippo, leggerà /etc/foo.d/*.conf - non ha davvero idea di come rilevare che i file siano appropriati o destinati a lui.)

Oltre a questo, alcuni programmi possono usare un numero magico nell'intestazione di un file. Specialmente per distinguere tra diversi tipi di file eseguibili - file ELF contro script di shell, librerie dinamiche (anche se usano l'estensione .so per aiuto e si trovano sotto una qualche forma di directory /lib - vedi i due metodi intuitivi sopra.), ecc.

Tuttavia, per fare un vero confronto alla pari, linux può semplicemente guardare una e distinguere se ha bisogno del programma LibreOffice documents? Che ne dite di Subsurface's dive logs? O i file del libro paga del vostro programma di contabilità personalizzato? png, jpeg, mpeg, avi, gif, etc.?

Vedete, i numeri magici sono sia costosi (dovete aprire il file per determinarlo - rendendo difficile la ricerca/parsing/filtraggio.), e inaffidabili (nulla impedisce ad un cattivo cittadino di iniettare un numero magico in cima al proprio file - proprio come chiunque può impostare un'estensione.)

Quindi la risposta breve è - Linux ha molti più metadati/intuizioni per andare avanti. Tuttavia, quando si confrontano i tipi di app che si eseguono su Windows e i tipi di app che si eseguono su un desktop Linux - si pareggia il campo di gioco e si hanno gli stessi problemi. Linux non può differenziare meglio tra formati altamente specifici per le app di quanto possa fare Windows (e certamente non in modo altrettanto economico) - e le estensioni (o numeri magici) dicono solo ad entrambi i sistemi operativi in quali programmi caricarli (NON che TIPO di file sono.)