Le estensioni di file hanno uno scopo (per il sistema operativo)?

66

Linux determina il tipo di un file tramite un codice nell'intestazione del file. Non dipende dalle estensioni di file per sapere quale software utilizzare per aprire il file.

Questo è quello che ricordo dalla mia educazione. Per favore correggimi nel caso in cui io abbia torto!

Di recente lavoro con i sistemi Ubuntu: vedo molti file sui sistemi che hanno estensioni come .sh , .txt , .o , .c

Ora mi chiedo: queste estensioni sono pensate solo per gli umani? In modo che si dovrebbe avere un'idea di che tipo di file è?

O hanno qualche scopo anche per il sistema operativo?

    
posta mizech 27.07.2016 - 08:46

7 risposte

37
  

Linux determina il tipo di un file tramite un codice nell'intestazione del file. Non dipende dalle estensioni dei file per sapere che il software deve essere utilizzato per aprire il file.

     

Questo è quello che ricordo dalla mia educazione. Per favore correggimi nel caso in cui mi sbaglio!

  • correttamente ricordato.
  

Queste estensioni sono pensate solo per gli umani?

  • Sì, con un ma.

Quando interagisci con altri sistemi operativi che dipendono dal fatto che gli interni siano quello che sono, è l'idea più intelligente di utilizzarli.

In Windows, il software di apertura è collegato alle estensioni.

L'apertura di un file di testo chiamato "file" è più difficile in Windows rispetto all'apertura dello stesso file denominato "file.txt" (dovrai cambiare la finestra di dialogo Apri file da *.txt a *.* ogni volta). Lo stesso vale per i file di testo separati da TAB e da punti e virgola. Lo stesso vale per l'importazione e l'esportazione di e-mail (estensione .mbox).

In particolare quando si codifica il software. L'apertura di un file denominato "software1" che è un file HTML e "software2" che è un file JavaScript diventa più difficile rispetto a "software.html" e "software.js".

Se esiste un sistema in Linux in cui le estensioni dei file sono importanti, lo chiamerei un bug. Quando il software dipende dalle estensioni dei file, questo è sfruttabile. Utilizziamo una direttiva dell'interprete per identificare cosa sia un file ("i primi due byte di un file possono essere i caratteri" # ! ", che costituiscono un numero magico (esadecimale 23 e 21, i valori ASCII di" # "e"! ") spesso indicati come shebang,").

Il problema più famoso con le estensioni di file era LOVE-LETTER-FOR-YOU.TXT.vbs su Windows. Questo è uno script di base visivo mostrato in file explorer come file di testo.

In Ubuntu quando avvii un file da Nautilus ricevi un avvertimento su cosa sta per fare. L'esecuzione di uno script da Nautilus in cui desidera avviare alcuni software in cui è previsto l'apertura di gEdit è ovvio un problema e riceviamo un avviso a riguardo.

Nella riga di comando quando esegui qualcosa, puoi vedere visivamente l'estensione. Se finisce su .vbs comincerei a diventare sospetto (non che .vbs sia eseguibile su Linux.) Almeno non senza un ulteriore sforzo;)).

    
risposta data Rinzwind 27.07.2016 - 09:01
64

Qui non c'è una risposta in bianco o nero al 100%.

Solitamente Linux non fa affidamento sui nomi dei file (e le estensioni dei file, ovvero la parte del nome del file dopo l'ultimo periodo normale) e determina invece il tipo di file esaminando i primi pochi byte del suo contenuto e confrontandolo con un elenco di numeri magici conosciuti.

Ad esempio, tutti i file immagine Bitmap (in genere con estensione del nome .bmp ) devono iniziare con le lettere BM nei loro primi due byte. Gli script nella maggior parte dei linguaggi di scripting come Bash, Python, Perl, AWK, ecc. (In pratica tutto ciò che tratta righe che iniziano con # come commento) possono contenere uno shebang come #!/bin/bash come prima riga. Questo commento speciale indica al sistema con quale applicazione aprire il file.

Quindi normalmente il sistema operativo si basa sul contenuto del file e non sul suo nome per determinare il tipo di file, ma affermare che le estensioni di file non sono mai necessarie su Linux è solo metà della verità.

Le applicazioni possono ovviamente implementare i controlli dei file come vogliono, compreso la verifica del nome e dell'estensione del file. Un esempio è Eye of Gnome ( eog , visualizzatore di immagini standard) che determina il formato dell'immagine in base all'estensione del file e genera un errore se non corrisponde al contenuto. Se questo è un bug o una funzionalità può essere discusso ...

Tuttavia, anche alcune parti del sistema operativo si basano su estensioni di nomi di file, ad es. durante l'analisi dei file sorgenti del software in /etc/apt/sources.list.d/ - solo i file con l'estensione *.list vengono analizzati e tutti gli altri vengono ignorati. Probabilmente non è usato principalmente per determinare il tipo di file qui, ma piuttosto per abilitare / disabilitare l'analisi di alcuni file, ma è comunque un'estensione di file che influisce sul modo in cui il sistema tratta un file.

E naturalmente l'utente umano trae maggiori vantaggi dalle estensioni di file in quanto rende ovvio il tipo di file e consente anche più file con lo stesso nome base e diverse estensioni come site.html , site.php , site.js , site.css ecc. Lo svantaggio è ovviamente che l'estensione del file e il tipo / contenuto di file effettivo non devono necessariamente coincidere.

Inoltre è necessario per l'interoperabilità tra piattaforme, come ad es. Windows non saprà cosa fare con un file readme , ma solo un readme.txt .

    
risposta data Byte Commander 27.07.2016 - 09:22
23

Come menzionato da altri, in Linux viene usato un metodo di direttiva interprete (memorizzando alcuni metadati in un file come un'intestazione o un numero magico in modo che l'interprete corretto possa dirti di leggerlo) piuttosto che il metodo di associazione delle estensioni del nome file usato da Windows .

Questo significa che puoi creare un file con quasi tutti i nomi che ti piacciono ... con alcune eccezioni

Tuttavia

Vorrei aggiungere una parola di cautela.

Se hai alcuni file sul tuo sistema da un sistema che usa l'associazione file, i file potrebbero non avere quei numeri magici o intestazioni. Le estensioni dei nomi file vengono utilizzate per identificare questi file da applicazioni che sono in grado di leggerli e potrebbero verificarsi alcuni effetti imprevisti se si rinomina tali file. Ad esempio:

Se si rinomina un file My Novel.doc in My-Novel , Libreoffice sarà comunque in grado di aprirlo, ma si aprirà come "Senza titolo" e sarà necessario rinominarlo nuovamente per salvarlo (Libreoffice aggiunge un estensione di default, quindi avresti due file My-Novel e My-Novel.odt , il che potrebbe essere noioso)

Più seriamente, se rinomina un file My Spreadsheet.xlsx in My-Spreadsheet, quindi prova ad aprirlo con xdg-open My-Spreadsheet otterrai questo (perché è in realtà un file compresso):

E se rinomini un file My Spreadsheet.xls a My-Spreadsheet , quando xdg-open My-Spreadsheet ottieni un errore che dice

  

posizione di apertura errore: nessuna applicazione è registrata come gestisce questo file

(Sebbene in entrambi questi casi funzioni OK se fai soffice My-Spreadsheet )

Se poi rinomini il file senza estensione in My-Spreadsheet.ods con mv e provi ad aprirlo, otterrai questo:

(riparazione fallita)

E dovrai riattivare l'estensione originale per aprire correttamente il file (puoi quindi convertire il formato se lo desideri)

TL; DR:

Se hai file non nativi con estensioni di nome, non rimuovere gli estensioni assumendo che tutto sia OK!

    
risposta data Zanna 27.07.2016 - 10:06
19

Mi piacerebbe adottare un approccio diverso a questo da altre risposte, e sfidare la nozione che "Linux" o "Windows" hanno qualcosa a che fare con questo (sopportare me).

Il concetto di estensione di un file può essere semplicemente espresso come "una convenzione per identificare il tipo di un file basato su parte del suo nome". Le altre convenzioni comuni per identificare il tipo di un file confrontano il suo contenuto con un database di firme conosciute (l'approccio "numero magico") e lo memorizzano come attributo extra sul file system (l'approccio utilizzato nel MacOS originale) .

Poiché ogni file su un sistema Windows o Linux ha sia un nome che un contenuto, i processi che vogliono conoscere il tipo di file possono usare l'approccio "estensione" o "numero magico" come meglio credono. L'approccio ai metadati non è generalmente disponibile, in quanto non esiste un posto standard per questo attributo nella maggior parte dei file system.

Su Windows, c'è una forte tradizione nell'usare l'estensione del file come mezzo principale per identificare un file; più visibilmente, il browser di file grafico (File Manager su Windows 3.1 e Explorer su Windows moderno) lo usa quando fai doppio clic su un file per determinare quale applicazione avviare. Su Linux (e, più in generale, sui sistemi basati su Unix), c'è più tradizione per l'ispezione dei contenuti; in particolare, il kernel esamina l'inizio di un file eseguito direttamente per determinare come eseguirlo; i file di script possono indicare un interprete da utilizzare iniziando con #! seguito dal percorso dell'interprete.

Queste tradizioni influenzano la progettazione dell'interfaccia utente dei programmi scritti per ciascun sistema, ma ci sono molte eccezioni, perché ogni approccio ha pro e contro in diverse situazioni. I motivi per utilizzare le estensioni di file anziché esaminare i contenuti includono:

  • esaminare i contenuti dei file è abbastanza costoso rispetto all'esame dei nomi dei file; quindi per esempio "trova tutti i file chiamati * .conf" sarà molto più veloce di "trova tutti i file la cui prima riga corrisponde a questa firma"
  • il contenuto del file può essere ambiguo; molti formati di file sono in realtà solo file di testo trattati in modo speciale, molti altri sono file zip appositamente strutturati e la definizione di firme accurate per questi può essere complicata
  • un file può essere veramente valido come più di un tipo; un file HTML può anche essere XML valido, un file zip e un GIF concatenati rimangono validi per entrambi i formati
  • l'abbinamento di numeri magici potrebbe portare a falsi positivi; un formato di file che non ha un'intestazione può iniziare con i byte "GIF89a" ed essere erroneamente identificato come immagine GIF
  • rinominare un file può essere un modo conveniente per contrassegnarlo come "disabilitato"; per esempio. cambiare "foo.conf" in "foo.conf ~" per indicare un backup è più facile che modificare il file per commentare tutte le sue direttive e più conveniente che spostarlo da una directory caricata automaticamente; allo stesso modo, rinominare un file .php in .txt indicherà ad Apache di servire la sua origine come testo semplice, invece di passarlo al motore PHP

Esempi di programmi Linux che utilizzano i nomi dei file per impostazione predefinita (ma potrebbero avere altre modalità):

  • gzip e gunzip hanno una gestione speciale di qualsiasi file che termina con ".gz"
  • gcc gestirà i file ".c" come C e ".cc" o ".C" come C ++
risposta data IMSoP 27.07.2016 - 19:13
14

In realtà, alcune tecnologie fanno si basano su estensioni di file, quindi se usi queste tecnologie in Ubuntu, dovrai fare affidamento anche sulle estensioni. Alcuni esempi:

  • gcc usa estensioni per distinguere tra file C e C ++. Senza l'estensione è praticamente impossibile distinguerli (immagina un file C ++ senza classi).
  • molti file ( docx , jar , apk ) sono solo archivi ZIP particolarmente strutturati. Mentre di solito è possibile dedurre il tipo dal contenuto, potrebbe non essere sempre possibile (ad es. Java Manifest è opzionale in jar file).

Non utilizzare le estensioni di file in questi casi sarà possibile solo con soluzioni alternative agli hacker ed è probabile che sia molto soggetta a errori.

    
risposta data Dmitry Grigoryev 27.07.2016 - 17:52
7

La tua prima ipotesi è corretta: le estensioni su Linux non contano e sono utili solo per gli esseri umani (e altri sistemi operativi non Unix che si preoccupano delle estensioni). Il tipo di file è determinato dai primi 32 bit di dati nel file, che è noto come numero magico Ecco perché gli script di shell richiedono #! line - per dire al sistema operativo quale interprete chiamare. Senza di esso, lo script della shell è solo un file di testo.

Per quanto riguarda i file manager, vogliono conoscere le estensioni di alcuni file, come .desktop file, che sostanzialmente sono la versione di scorciatoie di Windows ma con più capacità. Ma per quanto riguarda il sistema operativo, ha bisogno di sapere cosa c'è nel file, non cosa c'è nel suo nome

    
risposta data Sergiy Kolodyazhnyy 27.07.2016 - 09:02
5

Questo è troppo grande per una risposta di commento.

Ricorda che anche "l'estensione" ha significati molto diversi.

Di cosa stai parlando sembrano essere le 3 lettere dopo il. DOS ha reso il formato 8.3 molto popolare e Windows utilizza la parte .3 fino ad oggi.

Linux ha molti file come .conf o .list o .d o .c che hanno un significato, ma non sono realmente estensioni nel senso 8.3. Ad esempio Apache esamina /etc/apache2/sites-enabled/website.conf per la sua direttiva di configurazione. Mentre il sistema utilizza i tipi MIME e le intestazioni del contenuto e cosa non deve determinare se si tratta di un file di testo, Apache (di default) continua a non caricarlo senza che finisca in .conf.

.c è un altro grande. Sì, è un file di testo, ma gcc dipende da main.c che diventa main.o e infine main (dopo il collegamento). In nessun momento il sistema usa l'estensione .c, .o o no per avere alcun significato per quanto riguarda il contenuto, ma le cose dopo. ha qualche significato. Probabilmente dovresti configurare il tuo SCM per ignorare main.o e main.

L'essere punto è questo: le estensioni non vengono utilizzate come sono in Windows. Il kernel non eseguirà un file .txt perché rimuovi la parte .txt del nome. È anche molto felice di eseguire un file .txt se è impostata l'autorizzazione di esecuzione. Detto questo, hanno un significato e sono ancora utilizzati a un "livello di computer" per molte cose.

    
risposta data coteyr 27.07.2016 - 11:15

Leggi altre domande sui tag