web-dev-qa-db-ja.com

Linuxの特定のディレクトリにある実行可能ファイルのみを見つける方法はありますか。

Linuxの特定のディレクトリにある実行可能ファイルのみを見つける方法はありますか。

150
HaiYuan Zhang

実行可能ファイルの確認は、-perm(推奨されません)または-executable(ACLを考慮に入れるので推奨されます)を使用して実行できます。 -executableオプションを使用するには:

find <dir> -executable

実行可能ファイルのみを検索し、検索可能なディレクトリは検索したくない場合は、-type fと組み合わせます。

find <dir> -executable -type f
151
knittl

Findの-permオプションを使用してください。これにより、現在のディレクトリ内で、所有者、グループメンバー、または他の人によって実行可能なファイルが検索されます。

find . -perm /u=x,g=x,o=x

編集する

少なくともGNU find 4.4.0にある別のオプションを見つけたところです。

find . -executable

ACLも考慮されるので、これはさらにうまくいくはずです。

33
innaM

私は質問が特にLinuxについて言及しているのを知っています、しかしそれはグーグルでの最初の結果なので、私はちょうど探していた答えを加えたい/ Linuxシステム).

macOSでテスト済み10.12.5

find . -perm +111 -type f
12
friederbluemle

私が別のアプローチを持っているのは、実行可能ファイルで何かをすることだけが本当に必要な場合であり、必ずしも実際に検索を強制して自分自身をフィルタリングするわけではありません:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

プラットフォーム固有の-executableに依存しないため、これが好きです。 -permには依存していません。これは少し難解で、プラットフォーム固有のものであり、上記のとおり、ファイルはすべての人(あなただけでなく)に対して実行可能である必要があります。

-type fは重要です。これは、* nixディレクトリでは走査可能に実行可能である必要があり、クエリがfindコマンドに多く含まれるほど、コマンドのメモリ効率が高くなるためです。

とにかく、* nixは10億のアプローチの土地であるため、別のアプローチを提供するだけです。

3
Mark McKenna

実行可能とマークされたファイルは、実行可能ファイルまたはロード可能ファイルまたはオブジェクトである必要はありません。

これが私が使っているものです:

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

ワンライナーのファンとして...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

'xargs'を使用してfindコマンドからの出力を取得します(スペースを含むファイル名が正しく処理されるようにprint0を使用します)。実行可能なファイルのリストができたので、それらを1つずつ 'file'コマンドのパラメーターとして提供します。その後、バイナリを無視するためにASCIIという用語をgrepします。 findコマンドの-executableをあなたが好むスタイル(先の回答を参照)または 'NIX OSで動作するものに置き換えてください。

私はrootが所有するスクリプトの中でevalを持つファイルを見つけるために上記を必要としました。

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -Prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
1

私は今夜​​~/.bashrcに関数を作成し、システムパスやディレクトリではない実行可能ファイルを見つけました。

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

利点は、3つのLinuxディストリビューションと1つのWindowsインストールが1分以内に検索され、findコマンドに15分かかることです。

例えば:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

またはディレクトリ全体ですべてがサブディレクトリの場合

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
0