web-dev-qa-db-ja.com

Unixの検索:実行可能ファイルの検索

Unix findコマンドでどのタイプのパラメーター/フラグを使用して実行可能ファイルを検索できますか?

96
well actually

別の可能性があるように1 現在のユーザーが実行可能なファイルを見つけるには:

find . -type f -exec test -x {} \; -print

(ここでのテストコマンドはPATHにあるコマンドであり、ビルトインではなく、おそらく/usr/bin/testです)。


1 find-executableフラグが利用できない場合にのみこれを使用してください!これは、-perm +111ソリューションとは微妙に異なります。

9
gniourf_gniourf

-executableテストフラグを使用できます。

-executable
              Matches files which are executable  and  directories  which  are
              searchable  (in  a file name resolution sense).
9
codaddict
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に伝える必要もあります。

2
louigi600

これは私のために働いたと共有の考え...

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
2

簡単な答えは次のとおりです。「実行可能ファイルはPATH変数に含まれるディレクトリにあります」が、実際には実行可能ファイルが見つからず、とにかく多くの実行可能ファイルを見逃す可能性があります。

私はMacについてあまり知りませんが、「mdfind 'kMDItemContentType = public.unix-executable'」は解釈されたスクリプトのようなものを見逃すかもしれません

(実際に実行可能かどうかに関係なく)実行可能ビットが設定されたファイルを見つけても問題ない場合は、実行しても構いません

find . -type f -perm +111 -print

「-executable」オプションがサポートされている場合、aclやその他のアクセス許可のアーティファクトを検索するフィルターが作成されますが、技術的には「-pemr +111」とそれほど違いはありません。

多分将来、findは "-magic"をサポートし、特定のマジックIDを持つファイルを明示的に検索できるようになりますが、実行可能なすべてのフォーマットのマジックIDを細かく指定する必要があります。

UNIXで技術的に正しい簡単な方法を知りません。

1
louigi600

SO ばかげたこれは非常に簡単ではありません...言うまでもなく不可能の隣。/Spotlight ...

mdfind 'kMDItemContentType=public.unix-executable'

少なくとも動作します!

1
Alex Gray

私は同じ問題を抱えていましたが、その答えは 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)
0

したがって、実際に実行可能なファイルの種類(たとえば、スクリプト、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と呼ばれる小さなユーティリティが付属していますが、これは基本的に小さなテストをバンドルしているので、見つかった場合はコマンドラインを短縮できます。しかし、==テストを=〜テストに簡単に置き換えて、実行可能なプレーンテキストファイルやファイルコマンドが返すその他の情報など、より複雑なプロパティを簡単に確認できるため、この方法はより柔軟です。


ここでの引用の正確なルールは非常に不透明であるため、試行錯誤で解決するだけですが、正しい説明を聞きたいです。

0
Peter Gerdes