Unixシステムの「ファイルタイプ」とは、通常のファイル、ディレクトリ、名前付きパイプ、キャラクタースペシャルファイル、シンボリックリンクなどのことです。これらは、オプションでfind
フィルタリングできるファイルのタイプです-type
。
find
ユーティリティは、それ自体で「シェルスクリプト」、「JPEG画像ファイル」または任意の他の区別することはできません通常のファイルの種類。ただし、これらのタイプのデータはfile
ユーティリティによって区別される場合があります。ユーティリティは、ファイル自体の特定の署名を調べて、そのタイプを判別します。
さまざまなタイプのデータファイルにラベルを付ける一般的な方法は、そのMIMEタイプでありfile
、ファイルのMIMEタイプを判別できます。
file
with 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
その名前のスクリプトのみを検出する場合は-name sunrise
、その前に追加し-exec
ます。
上記の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
ためにではなく、を使用する必要があることに注意してください(オプションはまったく異なるものを実行します)。macOSの出力はLinuxシステムの出力に似ています。-i
見つかった各シェルスクリプトでカスタムアクションを実行したい場合は、上記のコマンドの-exec
代わりに別のアクションを実行できますが、次のようにすることもできます。-print
find
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 {} +
関連:
--filetype
ファイルの種類を示すfindコマンドやその他のオプションはありません。実行できる唯一のことは、bashスクリプトを探している場合や、Perlスクリプトなどの行を探し--exec file {} \;
ているgrep Bourne
場合に、パイプを使用することですgrep Perl
。