ファイルタイプでファイルを見つける方法は?

findを使用してファイルを見つけることができることはわかっています:find . -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 

コメント

  • ファイルの種類を示すfindコマンドまたはその他のオプション。実行できる唯一のことは、--exec file {} \;を使用してから、bashスクリプトまたはiv id =を探している場合は、それをgrep Bourneにパイプすることです。 “a2958af4ba”>

これらの行に沿ってPerlスクリプトなどを探している場合。

回答

Unixシステムの「ファイルタイプ」は、通常のファイル、ディレクトリ、名前付きパイプ、文字特殊ファイル、シンボリックリンクなどです。これらは次のタイプです。 find-typeオプションでフィルタリングできるファイル。

findユーティリティは、それ自体では「シェルスクリプト」、「JPEGイメージファイル」、またはその他のタイプの通常のファイルを区別できません。ただし、これらのタイプのデータは、fileユーティリティによって区別される場合があります。このユーティリティはファイル自体の特定の署名を調べてタイプを判別します。

ラベルを付ける一般的な方法さまざまなタイプのデータファイルは、 MIMEタイプによるものであり、fileはのMIMEタイプを判別できます。ファイル。


filefindを使用して、通常のファイルのMIMEタイプを検出し、それを使用します。シェルスクリプトのみを検索するには:

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 

その名前のスクリプトのみを検出する場合は、-execの前に-name sunriseを追加します。

上記のfindコマンドは、現在のディレクトリ内またはその下にあるすべての通常のファイルを検索し、そのようなファイルごとに短いインラインシェルスクリプトを呼び出します。このスクリプトは、見つかったファイルに対してfile -biを実行し、そのコマンドの出力に文字列/x-shellscriptが含まれている場合、終了ステータスはゼロで終了します。出力にその文字列が含まれていない場合、ゼロ以外の終了ステータスで終了します。これにより、findはすぐに次のファイルに進みます。ファイルがシェルスクリプトであることが判明した場合、findコマンドは、ファイルのパス名(-printを出力します。終了します。これは他のアクションで置き換えることもできます。

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

text/x-shellscript; charset=us-ascii 

のようになりますが、fileユーティリティ。

application/x-shellscript 

一般的なビットは/x-shellscriptサブストリングです。

macOSでは、理由のため、file -biの代わりにfile -bIを使用する必要があることに注意してください( -iオプションはまったく異なる動作をします)macOSでの出力はLinuxシステムの出力と似ています。


カスタムアクションを実行しますか見つかったシェルスクリプトごとに、次のことを実行できます。上記のfindコマンドの-printの代わりに別の-execを使用しますが、

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を実行できます次に、「興味のある結果」をgrepします。

# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word" 

検索パターンをできるだけ期待に近づけて、次の数を維持することをお勧めします。誤検知は低に一致します。

ファイル名に新しい行が含まれるファイルは、このアプローチで問題を引き起こす可能性があることに注意してください。

回答

perl” s File::LibMagicモジュールの使用:

perl -MFile::LibMagic=:easy -MFile::Find -le " find sub { print $File::Find::name if $_ eq "sunrise" and -f and MagicFile$_ eq "PEM RSA private key" }, @ARGV" -- . 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です