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


157

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


ここに一種のBASHスクリプトがあります、それは悪いことではありません:) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar 14年

標準fileコマンドの使用はどうですか?
ブレークスルー

5
Mac(OS X 10.9.5でテスト済み)でこれを実行したい場合: ls -l | egrep '^[^d]..x..x..x.*$' 上記は、現在のディレクトリ内のすべての実行可能ファイル(すべて/ユーザーおよびグループ)をリストします。 :この-executableオプションはMacでは機能しないため、上記の回避策があります。
techfoobar


1
@techfoobar:質問は曖昧です:実行可能コードを含むファイルを意味しますか、それとも実行可能許可を持つファイルを意味しますか?ただし、実行可能なアクセス許可が(応答の大部分がそうであるように)求められているものであると仮定しても、この質問はworld-executableとは言いません。ソリューションは-rwxr-x---、一部のユーザーに対して実行可能な750()ではなく、実行権限を持つファイル(およびfifo、ソケット、シンボリックリンクなど)を検出します。
G-マン

回答:


157

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

find <dir> -executable

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

find <dir> -executable -type f

23
シバングは、それらが実行可能であるという意味ではありません。どのインタープリターを使用するかだけを教えてくれます。Linuxの定義では、「実行可能ファイル」は実行可能(x)ビットが設定されたファイルです
knittl

2
-typeでそのタイプをサポートしているfindのバージョンは何ですか?manは私のシステムでリストb、c、d、p、f、l、s、Dを見つけます。
innaM

2
ここでも同じですが、私の検索には-type xどちらもありません。
davr

7
findの古いバージョン(おそらく4.3.8より前)があり、-executableが欠けている場合は、findを使用します。-perm / u = x、g = x、o = x。
ルートヴィヒワインツィール

8
find: invalid predicate -executable'RHEL
SSHで

33

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

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

編集:

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

find . -executable

ACLも考慮されるため、これはさらにうまく機能するはずです。


2
これは、findの新しいバージョンでのみ機能します。CentOSのではデフォルトで付属し1がエラーを与えるfind: invalid mode / uがX、G = xで、O = x'` =
davr

12
次に、GNU findで非推奨になった「-perm +」バージョンをお試しください:find。-perm +111 "
innaM 09/10/19

おそらく-perm /111最もポータブルなバージョンのようです。
スコット

12

私は質問が特にLinuxについて言及していることを知っていますが、それはGoogleでの最初の結果なので、私が探していた答えを追加したかっただけです/ Linuxシステム)。

macOS 10.12.5でテスト済み

find . -perm +111 -type f

1
RHEL 5でも機能します。
ホセトマストチーノ

これは私がOS X 10.14、THXに取り組んでいますことができる唯一のバリアントである
ジャスティン・

3

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

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

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

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

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


(0)どちらが好きですか、難解で正しいか、直観的で欠陥がありますか?私は正しいことを好みます。(1)  innaM's answer、featuring find -perm実行許可ビットが設定されているファイルを検索します。(2)対照的に、この回答は、現在のユーザーが実行許可を持っているファイルのみを検索します。確かに、それはOPが望んでいることかもしれませんが、それは不明です。…(続き)
スコット

(続き)...(3)明確にするために、あなたは変更する場合があります`…`$(…)-を参照して、このこの、およびこれを。(4)しかし、しないでくださいfor i in $(find …); do …。スペースを含むファイル名では失敗します。代わりに、してくださいfind … -exec …。(5)そして、シェル変数を使用するときは、正当な理由がない限り、常に(二重引用符で)引用符で囲みます。
スコット

@scott OK、私は訂正しました:)私は-perm3つすべてを必要とするものとして議論を読みましたが、そのうちの1つではありません。また、シェル引数を保護するための入力に感謝します。これは私が知らなかったすべてのことです。
マークマッケナ

@MarkMcKennaにタイプミスがあります:for i in find。-type f ; do [ -x $i ] && echo "$i is executable"; done; <dir>の部分がありません。ドット(。)を使用します
-Devy

2

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

私が使用するものは次のとおりです。

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
これは何をしますか?
DerMike

@DerMike、ファイルが検出可能な実行可能ファイルとしてマークされていなくても、.soファイルを含む現在のディレクトリで実行可能ファイルを見つける方法の1つです。
AjayKumarBasuthkar

まあ、私は意味、どのようにそれはそれを行うのですか?
DerMike

発見するファイルのヘッダーから読み取り、すべてのバイナリファイルまたはスクリプトファイルにヘッダーがあります。
-AjayKumarBasuthkar

私の知る限り、-name "*"影響findはありません。通常、テストで削除されないすべてのファイルを検出します。
Gマン

1

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

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

'xargs'を使用して、findコマンドから出力を取得します(スペースを含むファイル名が正しく処理されるようにprint0を使用します)。現在、実行可能なファイルのリストがあり、それらを「file」コマンドのパラメーターとして1つずつ提供しています。次に、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 &

スクリプトに非ASCII文字が含まれている場合、これは機能しません。fileエンコーディングを報告するため、Pythonスクリプトはとして報告できますa /usr/bin/python script, UTF-8 Unicode text executablefind ... | xargs file -b | grep -v '^ELF'非バイナリを見つけるのにもっとうまくいくかもしれません。
ゼノイド

0

~/.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ディストリビューションと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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.