Linuxでファイルのユーザービュー「タイプ」を決定する最も徹底的な方法は何ですか?

Linuxでファイルのユーザービュー「タイプ」を決定する最も徹底的な方法は何ですか?

私は(ファイルマネージャタイプのアプリケーションでは)ディレクトリ内の各ファイルがどのタイプのファイルであるかについて最も関連性の高い自然言語の説明を提供するために探しています。重複する利点を持ち、タスクの一部を実行するいくつかのコマンドラインメカニズムがあるようです。比較的一般的ないくつかのテストケースでこれらの動作を見てみましょう。 (-bオプションは、この例ではファイル名が繰り返し印刷されないようにするためです)。

  1. ssh-keygenによって生成された公開鍵(ファイル名の選択):
~> file -b xgl_ed25519.pub
OpenSSH ED25519 public key
~> mimetype -d -b xgl_ed25519.pub
Microsoft Publisher document
~> mimetype -d -M -b xgl_ed25519.pub # -M = "ignore extension"
plain text document

ドキュメントは正確で、mimetypeは非常に混乱しており、mimetype -Mは正確ですが、役に立たないほど具体的ではありません。

  1. 手書きマークダウンファイル:
Notes> file -b servers.md
Nim source code, Unicode text, UTF-8 text, with very long lines (5244)
Notes> mimetype -d -b servers.md
Markdown document
Notes> mimetype -d -M -b servers.md
plain text document

ドキュメントは非常に混乱しており、mimetypeは正確で、mimetype -Mは正確ですが、あまり役に立ちません。

  1. 偶然に非標準拡張子を持つJPEGファイルを受け取りました:
GVIP> file -b example.img
JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 960x720, components 3
GVIP> GVIP> mimetype -d -b example.img
Raw disk image
GVIP> mimetype -d -M -b example.img
JPEG image

ここにある文書は正確ですが、非常に冗長で、mimetypeが混乱し、mimetype -Mが正しいです。

この例の要点は、各アプローチがユーザーに提示したい最高の/最も実用的な答えを提供するさまざまな例に比較的頻繁に遭遇することです。しかし、ユーザーの立場でファイルの良い特性を判断することは明らかにかなりの関心を受けてきた問題である。結局のところ、ほとんどのファイルマネージャには「タイプ」フィールドがあります。 (たとえば、ロゴのないMIMEタイプライターもあることを知っていますが、file -iMIMEタイプは非常に冗長でユーザーフレンドリーではありません。自然言語の説明を探していますが、まだ問題があります。mimetypexdg-mime query filetype

したがって、問題は、ファイル形式の有用で正確で、特定の特性を得るための最も安定した方法は何ですか?私は"try"のようなロジックを組み立てたくありません。file短くて具体的な結果が出たらこれを行い、そうでない場合はフラグのmimetype有無を比較し-M、結果によってどれを信頼するかを決定します。 -Mなしで-Mと互換性がありますが、-Mよりも具体的であればそれを使用し、それ以外の場合は-Mレスポンスを使用してください。したくありません。

とにかく、一般的なファイル特性の問題はコマンドラインソリューションに限定されず、比較的一般的な現在の言語とそれに適したライブラリがある場合はそれを使用することもできます。どんな案内にも感謝します。

答え1

私はこの答えを決して受け入れません。ただ、現在使っている一時的な嫌悪感を共有しなければならないと思いました。遅くて粗いですが、非常に便利な結果を生み出すようです。長さがゼロのファイルの場合は、「空の」ファイル形式を生成するのが好きです。これを行うファイルマネージャは見たことがありません。

迅速なプロトタイプなので、xonshスクリプト形式を取ります。 xonshに慣れていない場合は、この場合、$(blah bloo)コマンドの出力をキャプチャするための非常に便利な構文を使用するPythonと見なすことができますblah bloo

#!/usr/bin/env xonsh
import re

filesez = $(file -b $ARG1)
filesez = filesez.strip()

# file is very good at detecting scripts:
script = re.search(r'\w*\s*script', filesez)
if script:
   print(script.group())
   exit(0)

# If file said anything complicated, we'll try mimetype
punctuation = re.search(r'[,;]', filesez)
# For text files, assume the extension is right
trust = (filesez == 'ASCII text')
if not (punctuation or trust):
   print(filesez)
   exit(0)

# OK, didn't get enough info from file, try mimetype
# Use a format that gives both the mime type and
# the description at once, to save calls
oformat = r'--output-format=%m|%d'
mimewith = $(mimetype @(oformat) $ARG1)
[mimetypewith, descwith] = mimewith.strip().split('|')

# Usually we go with the extension
desc = descwith
# And we always do with text files, as mentioned above
trust = (trust or 'Unicode text' in filesez)
if not trust:
   mimewithout = $(mimetype -M @(oformat) $ARG1)
   [mimetypewithout, descwithout] = mimewithout.strip().split('|')
   if mimetypewith.split('/')[0] == mimetypewithout.split('/')[0]:
      # If the types are compatible, believe the extension
      desc = descwith
   else:
      desc = descwithout

# Calling everything a document is a waste of screenspace:
if desc.endswith(' document'):
   desc = desc[0:-9]

# All right, we've done the best we can:
print(desc)

より良い回答があれば投稿してください。この問題を整理したいと思います。

関連情報