ファイルの種類別にファイルを見つける方法は?

ファイルの種類別にファイルを見つける方法は?

以下を使用してファイルを見つけることができることを知っていますfindfind . -type f -name 'sunrise'結果の例:

./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise

また、ファイルのファイル形式を決定できることも知っています。file sunrise結果の例:

sunrise: PEM RSA private key

しかし、ファイルタイプ別にファイルを見つける方法は?

たとえば、my-find . -type f -name 'sunrise' -filetype=bash-script:

./astronomy/sunrise
./schedule/sunrise

ベストアンサー1

Unixシステムの「ファイル形式」一般ファイル、ディレクトリ、名前付きパイプ、文字特殊ファイル、シンボリックリンクなど、これらのfindオプションを使用してフィルタリングできるファイル形式は次のとおりです-type

ユーティリティfind自体は、「シェルスクリプト」、「JPEGイメージファイル」、または他のファイルを区別することはできません。一般的なファイル形式。ただし、このタイプのデータは、fileファイルの内容の種類を決定するために、ファイル自体内の特定の署名を調べるユーティリティによって区別できます。

さまざまな種類のデータファイルにラベルを付ける一般的な方法は、MIMEタイプfileファイルのMIMEタイプを決定できます。


一般ファイルのMIMEタイプを検出し、それを使用してシェルスクリプトのみを見つけるには、filewithを使用します。find

find . -type f -exec sh -c '
    case $( file -bi "$1" ) in (*/x-shellscript*) exit 0; esac
    exit 1' sh {} \; -print

またはbash

find . -type f -exec bash -c '
    [[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} \; -print

その名前のスクリプトのみを検出するには、-name sunrise前に追加してください。-exec

上記のコマンドは、find現在のディレクトリ内または下のすべての一般的なファイルを検索し、そのような各ファイルに対して短いインラインシェルスクリプトを呼び出します。スクリプトはfile -bi見つかったファイルで実行され、コマンド出力に文字列が含まれている場合は終了ステータス0で終了します/x-shellscript。出力にこの文字列が含まれていない場合は、ゼロ以外の終了状態で終了し、find次のファイルにすぐに続行されます。ファイルがシェルスクリプトであると確認されると、findコマンドはファイルのパス名を出力し続けます(-print最後のパスは他の操作に置き換えることもできます)。

このfile -biコマンドはファイルのMIMEタイプを出力します。 Linux(および他のほとんどのシステム)のシェルスクリプトの場合、これは次のとおりです。

text/x-shellscript; charset=us-ascii

このユーティリティの少し古いバージョンがインストールされているシステムでは、file次の問題が発生する可能性があります。

application/x-shellscript

共通ビットは/x-shellscript部分文字列です。

file -bImacOSでは代わりに使用する必要がありますfile -bi理由(この-iオプションはまったく異なる機能を果たします)。 macOSの出力はLinuxシステムの出力と似ています。


見つかった各シェルスクリプトに対していくつかのカスタムアクションを実行しますか?上記のコマンド-execの代わりに他のスクリプトを使用することもできますが、次のこともできます。-printfind

find . -type f -exec sh -c '
    for pathname do
        case $( file -bi "$pathname" ) in
            */x-shellscript*) ;;
            *) continue
        esac

        # some code here that acts on "$pathname"

    done' sh {} +

またはbash

find . -type f -exec bash -c '
    for pathname do
        [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue

        # some code here that acts on "$pathname"

    done' bash {} +

関連:

おすすめ記事