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