Pastebinitでファイル形式を自動的に検出する方法は?

Pastebinitでファイル形式を自動的に検出する方法は?

私は使う貼り付け binitクリップを共有してください。ご覧のとおり、-fレンダリングされたWebページには、ファイル形式(または-f python-f bashに基づいてアップロードされたファイルを強調表示するスイッチがあります。

手動で正しいスイッチを提供する必要がないように、コードスニペットファイル形式を自動的に検出したいと思います。

  1. Pastebitでこれは可能ですか?
  2. これをスクリプトでラップし、他のユーティリティを使用してファイル形式を検出できますか?

たとえば、次のように試しましたが、fileここでは役に立たないと思います。

$ file --mime-type -b main.c 
text/x-c  # Should have been C

$ file --mime-type -b script.py 
text/x-python  # Should have been Python

$ file --mime-type -b README.md 
text/plain  # Should have been Markdown

$ file --mime-type -b ~/.bashrc 
text/plain  # Should have been Bash

$ file --mime-type -b ~/blah/main.cpp 
text/x-c  # Should have been Cpp

ベストアンサー1

自動ツールはコンテンツまたは名前のみを表示し、特定のファイルの種類を識別できません。fileそして他の同様のツールは情報に基づいて推測するだけであり、いくつかのファイル形式が重複する可能性があるため、常に正確である必要はありません(興味深い事実 - ファイルごとにQuakeファイルとして識別されたSlackware Linuxパッケージログファイル)または一部のファイル形式が他のファイル形式と簡単に区別できるほど具体的ではないためです(Markdownの全体的な目的は、.mdファイルをプレーンテキストファイルのように見せることです)。

あなたの例では、すべてのファイルの.bashrc拡張子が異なるため、これを使用してタイプを識別できるスクリプトを書くことができますが、* nixシステムではファイル拡張子が特定のプログラムでのみ機能することに注意してください。プログラムが重要です。カーネルは関係ありません。たとえば、script.shシェルスクリプトを作成します。

$ cat << EOF > script.sh
> #!/usr/bin/env bash
>
> echo hi
> EOF

実行可能ビットを設定して実行します。

$ chmod +x ./script.sh
$ ./script.sh
hi

名前を変更して、script.md次を実行します。

$ mv ./script.sh ./script.md
$ ./script.md
hi

ご覧のとおり、名前をscript.md

これは〜になりますかなり最新の言語(PythonやBashなど)で、ファイル名拡張子に基づいてファイル形式を推測するためのツールを作成するために使用されます。whatisthis.shBashの例は次のとおりです。

#!/usr/bin/env bash

if [ ! $# -eq 1 ]
then
    printf "Usage: %s file_with_extension\n" "$0" >&2
    exit 1
fi

ext="$(rev <<< "$1" | cut -d . -f1 | rev)"

declare -A extensions=(
    [c]=C
    [py]=Python
    [md]=Markdown
    [cpp]=Cpp
)

printf "%s\n" "${extensions["$ext"]}"

使用法:

$ ./whatisthis.sh README.md
Markdown
$ ./whatisthis.sh main.py
Python
$ ./whatisthis.sh main.c
C

もちろん他にも多いでしょうが、おそらくさまざまな種類のファイルに対して、数千の異なるファイル拡張子があります。 おそらく、誰かがファイル拡張子を使用してタイプを識別するより強力なスクリプトを書いた可能性があります。

これについて.bashrcは追加して識別できます。すべての新しい対話式シェルで選択され、で始まるすべての行がコメントとして処理されるため、追加しても中断されません。file#!/usr/bin/env bash#

通常、ファイル形式を自動的に検出する方法はありません。最良の結果を得るには、ファイル拡張子を組み合わせて確認する必要がありますfileが、最終的に与えられたファイルの用途を理解することは常に人間のユーザーの役割です。

おすすめ記事