コマンドライン – Linuxで特定のディレクトリの下にある実行ファイルだけを見つけるにはどうすればいいですか?

bash command-line find linux

Linuxで特定のディレクトリ以下の実行ファイルだけを見つけるにはどうすればいいですか?

  185  HaiYuan Zhang  2009-09-10


ベストアンサー

実行可能ファイルのチェックは、-perm (推奨しない) または -executable (ACLを考慮しているので推奨) で行うことができます。-executableオプションを使用するには

find <dir> -executable

検索可能なディレクトリではなく、実行可能なファイルだけを見つけたい場合は、-type fと組み合わせてください

find <dir> -executable -type f

180  knittl  2009-09-10


find の -perm オプションを使用します。これは、カレントディレクトリの中から、所有者、グループメンバー、または他の人が実行可能なファイルを見つけます

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

Edit:

少なくともGNU find 4.4.0には存在する別のオプションを見つけました

find . -executable

ACLも考慮されているので、これはもっとうまくいくはずです

37  innaM  2009-09-10


この質問がLinuxに特に言及していることは知っていますが、Googleの最初の結果なので、私が探していた答えを追加したかっただけです(例えば、あなたが-今のところ私のように-雇用主からGNU/Linux以外のシステムを使うように強制されている場合)

macOS 10.12.5でテストしました

find . -perm +111 -type f

28  friederbluemle  2017-06-01


別のアプローチもありますが、本当にやりたいことは実行ファイルで何かをすることです

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

私がこれを好むのは、プラットフォーム固有の-executableに頼らないからで、また、少し難解でプラットフォーム固有の-permに頼らないからです

-type fは、*nixのディレクトリがトラバース可能なように実行可能でなければならないので重要です

いずれにしても、*nixは10億のアプローチの国なので、別のアプローチを提供しているだけです

5  Mark McKenna  2016-04-24


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

私が使っているのはこんな感じです

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

3  AjayKumarBasuthkar  2014-03-26


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

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

xargs’ を使用して find コマンドの出力を取得します (スペースを含むファイル名が正しく処理されるように print0 を使用します)。これで実行可能なファイルのリストができたので、’file’ コマンドのパラメータとしてそれらを一つずつ指定します。そして、バイナリを無視するために ASCII という用語を grep します。findコマンドの-executableは、お好みのスタイル(以前の回答を参照してください)や’NIX OS’上で動作するもので代用してください

私は上記のようにrootが所有するスクリプトのevalを持つファイルを見つける必要があったので、rootユーザが安全ではないパラメータを持つスクリプトを実行してしまうようなprivエスカレーションの弱点を見つけるのに役立つように以下のようなものを作成しました

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 &

2  Richard Braganza  2017-07-09


今晩は~/.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 ()

利点は、findコマンドが15分かかるところを、3つのLinuxディストロとWindowsのインストールを1秒以内に検索してくれることです

For example:

$ 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

1  WinEunuuchs2Unix  2019-06-06


タイトルとURLをコピーしました