Unix find
コマンドでどのタイプのパラメーター/フラグを使用して実行可能ファイルを検索できますか?
別の可能性があるように1 現在のユーザーが実行可能なファイルを見つけるには:
find . -type f -exec test -x {} \; -print
(ここでのテストコマンドはPATHにあるコマンドであり、ビルトインではなく、おそらく/usr/bin/test
です)。
1 find
の-executable
フラグが利用できない場合にのみこれを使用してください!これは、-perm +111
ソリューションとは微妙に異なります。
-executable
テストフラグを使用できます。
-executable
Matches files which are executable and directories which are
searchable (in a file name resolution sense).
find . -executable -type f
ファイルが実行可能であることを実際に保証するものではなく、実行ビットが設定されたファイルを検出します。もしあなたがそうするなら
chmod a+x image.jpg
上記の検索では、実行ビットが設定されたjpegイメージであっても、image.jpgは実行可能ファイルであると見なされます。
私は通常、これに関する問題を回避します:
find . -type f -executable -exec file {} \; | grep -wE "executable|shared object|ELF|script|a\.out|ASCII text"
実行可能ファイルに関するドーム情報を実際に印刷したい場合は、次のようなことができます:
find . -type f -executable -printf "%i.%D %s %m %U %G %C@ %p" 2>/dev/null |while read LINE
do
NAME=$(awk '{print $NF}' <<< $LINE)
file -b $NAME |grep -qEw "executable|shared object|ELF|script|a\.out|ASCII text" && echo $LINE
done
上記の例では、ファイルのフルパス名は最後のフィールドにあり、ファイル名が「NF」を正しい数値位置に置き換えるために必要な検索出力文字列。区切り文字がスペースでない場合は、区切り文字をawkに伝える必要もあります。
これは私のために働いたと共有の考え...
find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print
簡単な答えは次のとおりです。「実行可能ファイルはPATH変数に含まれるディレクトリにあります」が、実際には実行可能ファイルが見つからず、とにかく多くの実行可能ファイルを見逃す可能性があります。
私はMacについてあまり知りませんが、「mdfind 'kMDItemContentType = public.unix-executable'」は解釈されたスクリプトのようなものを見逃すかもしれません
(実際に実行可能かどうかに関係なく)実行可能ビットが設定されたファイルを見つけても問題ない場合は、実行しても構いません
find . -type f -perm +111 -print
「-executable」オプションがサポートされている場合、aclやその他のアクセス許可のアーティファクトを検索するフィルターが作成されますが、技術的には「-pemr +111」とそれほど違いはありません。
多分将来、findは "-magic"をサポートし、特定のマジックIDを持つファイルを明示的に検索できるようになりますが、実行可能なすべてのフォーマットのマジックIDを細かく指定する必要があります。
UNIXで技術的に正しい簡単な方法を知りません。
SO ばかげたこれは非常に簡単ではありません...言うまでもなく不可能の隣。/Spotlight ...
mdfind 'kMDItemContentType=public.unix-executable'
少なくとも動作します!
私は同じ問題を抱えていましたが、その答えは dmenuソースコード :その目的のために作られたstestユーティリティにありました。 'stest.c'および 'arg.h'ファイルをコンパイルできますが、動作するはずです。使用法のマニュアルページがありますが、便宜上、そこに掲載しています。
STEST(1) General Commands Manual STEST(1)
NAME
stest - filter a list of files by properties
SYNOPSIS
stest [-abcdefghlpqrsuwx] [-n file] [-o file]
[file...]
DESCRIPTION
stest takes a list of files and filters by the
files' properties, analogous to test(1). Files
which pass all tests are printed to stdout. If no
files are given, stest reads files from stdin.
OPTIONS
-a Test hidden files.
-b Test that files are block specials.
-c Test that files are character specials.
-d Test that files are directories.
-e Test that files exist.
-f Test that files are regular files.
-g Test that files have their set-group-ID
flag set.
-h Test that files are symbolic links.
-l Test the contents of a directory given as
an argument.
-n file
Test that files are newer than file.
-o file
Test that files are older than file.
-p Test that files are named pipes.
-q No files are printed, only the exit status
is returned.
-r Test that files are readable.
-s Test that files are not empty.
-u Test that files have their set-user-ID flag
set.
-v Invert the sense of tests, only failing
files pass.
-w Test that files are writable.
-x Test that files are executable.
EXIT STATUS
0 At least one file passed all tests.
1 No files passed all tests.
2 An error occurred.
SEE ALSO
dmenu(1), test(1)
dmenu-4.6 STEST(1)
したがって、実際に実行可能なファイルの種類(たとえば、スクリプト、ELFバイナリなど)を実際に検索する場合は、単にpermissionのファイルを検索するだけでなく、おそらく次のように(現在のディレクトリ。は任意のディレクトリに置き換えることができます):
gfind . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print
または、macports(Linuxユーザー)を使用していない人、または必要に応じてgnu findをインストールしている人向け:
find . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print
OS Xを使用している場合は、is_execと呼ばれる小さなユーティリティが付属していますが、これは基本的に小さなテストをバンドルしているので、見つかった場合はコマンドラインを短縮できます。しかし、==テストを=〜テストに簡単に置き換えて、実行可能なプレーンテキストファイルやファイルコマンドが返すその他の情報など、より複雑なプロパティを簡単に確認できるため、この方法はより柔軟です。
ここでの引用の正確なルールは非常に不透明であるため、試行錯誤で解決するだけですが、正しい説明を聞きたいです。