すでに持っている二つ 質問このトピックについてはここで説明しますが、どちらも実際のタイトルではないスクリプトのエラーを解決します。
ファイルの種類に応じて、ファイルに関する基本情報を取得するプログラムを開発したいと思います。ディレクトリ、テキスト、バイナリデータを区別したい。
これまで私は以下を使用していますfile
:
case "$(file --dereference $arg)" in
*directory) ls -l --color=auto --almost-all --human-readable --group-directories-first --file-type --dereference-command-line "$@";;
*text*|*JSON*) bat --style header "$@";;
esac
これはほとんど機能しますが、ご覧のように例外を追加する必要がありました。JSON次のようにfile
識別されます。JSONデータ言及されていないテキスト。問題は、より多くの例外があり、それを個別に追加したくないことです。
file
コンテンツタイプに関するより一般的な情報を他の標準プログラムから取得する方法はありますか?
答え1
いくつかの努力の終わりに、私は良い解決策を見つけました。
case "$(file --dereference --mime $arg)" in
*inode/directory*) ls -l --color=auto --almost-all --human-readable --group-directories-first --file-type --dereference-command-line "$@";;
*binary) ;;
*) bat --style header "$@";;
esac
これは本質的に方法を逆にします。file --mime
つまり、文字セットを出力します。バイナリテキスト以外のすべてのファイルについて。そうすれば、そうでないすべてを処理します。バイナリテキストではうまくいくようです。
ディレクトリに興味がない場合は、バイナリファイルとしても分類されるので、次のものを使用できます。
case "$(file --dereference --mime $arg)" in
*binary) echo "$arg is not text";;
*) echo "$arg is text";;
esac