web-dev-qa-db-ja.com

ファイル拡張子には目的がありますか(オペレーティングシステム用)?

Linuxは、ファイルヘッダーのコードを介してファイルのタイプを判別します。どのソフトウェアがファイルを開くために使用されるかを知るために、ファイル拡張子に依存しません。

それは私の教育から覚えていることです。私が間違っている場合に備えて修正してください!

最近、Ubuntuシステムで少し作業しています:.sh.txt.o.cなどの拡張子を持つシステム上のファイルがたくさんあります

今、私は不思議に思っています:これらの拡張機能は人間専用です?それでは、どのようなファイルであるかを把握する必要がありますか?

または、オペレーティングシステムにも何らかの目的がありますか?

73
mizech

Linuxは、ファイルヘッダーのコードを介してファイルのタイプを判別します。ソフトウェアがファイルを開くために使用することを知るために、ファイル拡張子に依存しません。

それは私の教育から覚えていることです。私が間違っている場合に備えて修正してください!

  • 正しく記憶された。

これらの拡張機能は人間のみを対象としていますか?

  • はい、しかし。

拡張機能に依存している他のオペレーティングシステムと対話するときは、それらを使用するのが賢明です。

Windowsでは、開くソフトウェアは拡張機能に添付されます。

Windowsでは、「file」という名前のテキストファイルを開くのは、「file.txt」という名前の同じファイルを開くよりも困難です(毎回、ファイルを開くダイアログを*.txtから*.*に切り替える必要があります)。 TABおよびセミコロンで区切られたテキストファイルについても同様です。電子メール(.mbox拡張子)のインポートおよびエクスポートについても同じことが言えます。

特にソフトウェアをコーディングするとき。 HTMLファイルである「software1」およびJavaScriptファイルである「software2」という名前のファイルを開くことは、「software.html」および「software.js」に比べて難しくなります。


Linuxでファイル拡張子が重要な場所にシステムがある場合、それをバグと呼びます。ソフトウェアがファイル拡張子に依存している場合、それは悪用可能です。 インタープリターディレクティブ を使用して、ファイルが何であるかを識別します(「ファイルの最初の2バイトは、マジックナンバーを構成する文字「#!」にすることができます(16進数23および21、ASCII「#」および「!」の値)は、多くの場合シェバンと呼ばれます。」)。

ファイル拡張子に関する最も有名な問題は、Windowsで LOVE-LETTER-FOR-YOU.TXT.vbs でした。これは、エクスプローラーでテキストファイルとして表示される視覚的な基本スクリプトです。

Ubuntuでは、Nautilusからファイルを起動すると、何をするのかという警告が表示されます。 gEditを開くはずのソフトウェアを起動したいNautilusからスクリプトを実行することは明らかな問題であり、警告が表示されます。

コマンドラインで何かを実行すると、拡張機能が何であるかを視覚的に確認できます。 .vbsで終わる場合、私は疑わしくなり始めます(.vbsがLinuxで実行可能であるということではありません。少なくとも多少の努力なしではありません;))。

39
Rinzwind

ここに100%の黒または白の答えはありません。

通常Linuxはファイル名(およびファイル拡張子、つまり通常の最後の期間の後のファイル名の部分)に依存せず、代わりにファイルタイプを決定しますコンテンツの最初の数バイトを調べて、既知の マジックナンバー のリストと比較します。

たとえば、すべてのビットマップイメージファイル(通常は名前拡張子.bmp)は、最初の2バイトがBMで始まる必要があります。 Bash、Python、Perl、AWKなどのほとんどのスクリプト言語(基本的に、#で始まる行をコメントとして扱うすべてのもの)のスクリプトには、最初の行として#!/bin/bashのようなシバンが含まれる場合があります。この特別なコメントは、ファイルを開くアプリケーションをシステムに伝えます。

そのため、通常、オペレーティングシステムはファイルの種類を判断するためにファイルの名前ではなくファイルの内容に依存しますが、Linuxではファイル拡張子が必要ないということは真実の半分にすぎません。


もちろん、アプリケーションは必要に応じてファイルチェックを実装できます。これには、ファイル名と拡張子の検証が含まれます。例は、ファイル拡張子によって画像形式を決定し、コンテンツと一致しない場合にエラーをスローするGnomeの目(eog、標準の画像ビューアー)です。これがバグなのか機能なのかを議論できます...

ただし、オペレーティングシステムの一部でさえ、ファイル名拡張子に依存しています。ソフトウェアを解析するときに/etc/apt/sources.list.d/のファイルをソースします-*.list拡張子を持つファイルのみが解析され、他のすべては無視されます。主にここでファイルタイプを判別するのではなく、一部のファイルの解析を有効/無効にするために使用される可能性がありますが、システムによるファイルの処理方法に影響するファイル拡張子です。

そしてもちろん、人間のユーザーはファイル拡張子から最も利益を得ます。これにより、ファイルの種類が明らかになり、site.htmlsite.phpsite.jssite.cssなどの異なる拡張子を持つ複数のファイルも許可されます。拡張子と実際のファイルタイプ/コンテンツは必ずしも一致する必要はありません。

さらに、クロスプラットフォームの相互運用性のために必要です。 Windowsはreadmeファイルをどうするかを知りませんが、readme.txtだけを知ります。

68
Byte Commander

他の人が述べたように、Linuxでは、Windowsで使用されるファイル名拡張子の関連付け方法ではなく、インタープリターディレクティブメソッドが使用されます(ファイルにいくつかのメタデータをヘッダーまたはマジックナンバーとして保存し、正しいインタープリターに読み取るように指示できるようにします)。

これは、好きな名前のファイルを作成できることを意味します... いくつかの例外を除いて

しかしながら

注意点を追加したいと思います。

ファイル名の関連付けを使用するシステムからのファイルがシステム上にある場合、ファイルにはそれらのマジックナンバーまたはヘッダーがない場合があります。ファイル名拡張子は、これらのファイルを読み取ることができるアプリケーションによってこれらのファイルを識別するために使用されます。このようなファイルの名前を変更すると、予期しない影響が生じる可能性があります。例えば:

ファイルの名前をMy Novel.docからMy-Novelに変更しても、Libreofficeはそれを開くことができますが、「無題」として開き、保存するために再度名前を付ける必要があります(Libreofficeは追加しますデフォルトでは拡張子なので、2つのファイルMy-NovelMy-Novel.odtがあります。

さらに深刻なことに、ファイルの名前をMy Spreadsheet.xlsxからMy-Spreadsheetに変更し、xdg-open My-Spreadsheetで開くと、これが得られます(実際には圧縮ファイルであるため)。

また、ファイルの名前をMy Spreadsheet.xlsからMy-Spreadsheetに変更すると、xdg-open My-Spreadsheetにエラーが表示されます

場所を開くエラー:このファイルを処理するアプリケーションは登録されていません

(どちらの場合でも、soffice My-Spreadsheetを実行すれば問題なく動作します)

その後、拡張子のないファイルの名前をmvMy-Spreadsheet.odsに変更してから開こうとすると、次のようになります。

(修復に失敗しました)

また、ファイルを正しく開くには元の拡張子を戻す必要があります(必要に応じて形式を変換できます)。

TL; DR:

名前の拡張子が付いた非ネイティブファイルがある場合、すべてが正常であると仮定して拡張子を削除しないでください!

24
Zanna

私はこれに対して他の答えとは異なるアプローチを取り、「Linux」または「Windows」がこれと関係があるという考えに挑戦したいと思います(私と一緒に耐えてください)。

ファイル拡張子の概念は、単に「名前の一部に基づいてファイルのタイプを識別するための規則」として表現できます。ファイルのタイプを識別するためのその他の一般的な規則は、その内容を既知の署名のデータベースと比較し(「マジックナンバー」アプローチ)、ファイルシステムに追加の属性として保存します(元のMacOSで使用されたアプローチ) 。

WindowsまたはLinuxシステム上のすべてのファイルには名前と内容の両方があるため、ファイルタイプを知りたいプロセスは、「拡張子」または「マジックナンバー」アプローチを適切に使用できます。ほとんどのファイルシステムにはこの属性の標準的な場所がないため、メタデータアプローチは一般に利用できません。

Windowsでは、ファイルを識別する主な手段としてファイル拡張子を使用するという強い伝統があります。最も目に見えるのは、ファイルをダブルクリックして起動するアプリケーションを決定するときに、グラフィカルファイルブラウザー(Windows 3.1ではファイルマネージャー、最新のWindowsではエクスプローラー)がそれを使用することです。 Linux(より一般的にはUnixベースのシステム)では、コンテンツを検査するための伝統があります。最も顕著なのは、カーネルが直接実行されるファイルの先頭を見て、その実行方法を決定することです。スクリプトファイルは、#!で始まり、その後にインタープリターへのパスが続くことにより、使用するインタープリターを示すことができます。

これらの伝統は、各システム用に作成されたプログラムのUI設計に影響を与えますが、各アプローチには異なる状況で長所と短所があるため、多くの例外があります。内容を調べるのではなくファイル拡張子を使用する理由は次のとおりです。

  • ファイルの内容を調べることは、ファイル名を調べることと比較してかなり費用がかかります。たとえば、「*。confという名前のすべてのファイルを検索する」は、「最初の行がこの署名に一致するすべてのファイルを検索する」よりもはるかに高速です
  • ファイルの内容があいまいになることがあります。多くのファイル形式は実際には特別な方法で処理された単なるテキストファイルであり、他の多くは特別に構造化されたZipファイルであり、これらの正確な署名を定義するのは難しい場合があります
  • ファイルは、複数のタイプとして真に有効な場合があります。 HTMLファイルも有効なXMLである場合があります。ZipファイルとGIFを連結すると、両方の形式で引き続き有効です。
  • マジックナンバーの一致により、誤検出が生じる可能性があります。ヘッダーのないファイル形式は、バイト "GIF89a"で始まり、GIFイメージと誤認される可能性があります
  • ファイルの名前を変更すると、そのファイルを「無効」とマークする便利な方法になります。例えば「foo.conf」を「foo.conf〜」に変更すると、ファイルを編集してすべてのディレクティブをコメントアウトするよりも簡単であり、自動ロードされたディレクトリから移動するよりも便利です。同様に、.phpファイルの名前を.txtに変更すると、ApacheはPHPエンジンに渡すのではなく、ソースをプレーンテキストとして提供するようになります。

デフォルトでファイル名を使用する(ただし、他のモードがある場合がある)Linuxプログラムの例:

  • gzipおよびgunzipは、「。gz」で終わるファイルを特別に処理します。
  • gccは「.c」ファイルをCとして、「。cc」または「.C」をC++として処理します
20
IMSoP

実際、一部のテクノロジーdoはファイル拡張子に依存しているため、Ubuntuでこれらのテクノロジーを使用する場合は、拡張子にも依存する必要があります。いくつかの例:

  • gccは、拡張機能を使用してCファイルとC++ファイルを区別します。拡張機能がなければ、それらを区別することはほとんど不可能です(クラスのないC++ファイルを想像してください)。
  • 多くのファイル(docxjarapk)は、特に構造化されたZipアーカイブです。通常、コンテンツからタイプを推測できますが、常に可能とは限りません(例:Java Manifest is optional in jar files)。

そのような場合にファイル拡張子を使用しないことは、ハッキングの回避策でのみ可能となり、非常にエラーが発生しやすくなります。

15

最初の仮定は正しい:Linuxの拡張機能は重要ではなく、人間(および拡張機能を気にする他の非Unix系OS)にのみ有用です。ファイルのタイプは、ファイル内の最初の32ビットのデータによって決定されます。これは、 マジックナンバー として知られています。これが、シェルスクリプトに#!行が必要な理由です。コール。それがなければ、シェルスクリプトは単なるテキストファイルです。

ファイルマネージャに関する限り、.desktop filesなどの一部のファイルの拡張子を知りたいと思っています。これは基本的にWindowsのショートカットバージョンと同じですが、より多くの機能を備えています。しかし、OSに関する限り、ファイルの名前ではなくファイルの内容を知る必要があります。

7

これはコメントの回答には大きすぎます。

「拡張」でさえも意味が異なる場合が多いことに留意してください。

あなたが話しているのは、後の3文字です。 DOSは8.3形式を非常に人気があり、Windowsは今日まで.3部分を使用しています。

Linuxには、.conf、.list、.d、.cなどの意味のある多くのファイルがありますが、8.3の意味では実際には拡張子ではありません。たとえば、Apacheは/etc/Apache2/sites-enabled/website.confで構成ディレクティブを探します。システムはMIMEタイプとコンテンツヘッダー、およびテキストファイルであると判断しないものを使用しますが、Apache(デフォルト)は、.confで終わることなくロードしません。

.cもまた素晴らしいものです。はい、それはテキストファイルですが、gccはmain.cがmain.oになり、最終的にmainになること(リンク後)に依存しています。システムは、.c、.o、または拡張子を使用せず、コンテンツに関しては意味を持ちますが、。何らかの意味がありますmain.oとmainを無視するようにSCMをセットアップするでしょう。

ポイントはこれです:拡張機能はウィンドウ内で使用される方法では使用されません。名前の.txt部分を削除するため、カーネルは.txtファイルを実行しません。実行権限が設定されている場合は、.txtファイルを実行しても非常に満足です。そうは言っても、それらには意味があり、いまだに「コンピューターレベル」で多くのことに使用されています。

6
coteyr