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
コメント
これらの行に沿ってPerlスクリプトなどを探している場合。
回答
Unixシステムの「ファイルタイプ」は、通常のファイル、ディレクトリ、名前付きパイプ、文字特殊ファイル、シンボリックリンクなどです。これらは次のタイプです。 find
が-type
オプションでフィルタリングできるファイル。
find
ユーティリティは、それ自体では「シェルスクリプト」、「JPEGイメージファイル」、またはその他のタイプの通常のファイルを区別できません。ただし、これらのタイプのデータは、file
ユーティリティによって区別される場合があります。このユーティリティはファイル自体の特定の署名を調べてタイプを判別します。
ラベルを付ける一般的な方法さまざまなタイプのデータファイルは、 MIMEタイプによるものであり、file
はのMIMEタイプを判別できます。ファイル。
file
とfind
を使用して、通常のファイルの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" -- .
--exec file {} \;
を使用してから、bashスクリプトまたはiv id =を探している場合は、それをgrep Bourne
にパイプすることです。 “a2958af4ba”>