ターミナルのフォルダー内ですべての実行可能ファイルを検索します


17

私は、フォルダ持っているmyfolderファイル/フォルダの巨大な階層が含まれています。
このフォルダ内のすべての実行可能ファイルを見つける方法は?

Ubuntuではこれは機能します: find . -executable -type f

ただし、Mac OS X Mavericks(これもを使用bash)は、取得に失敗します。

find: -executable: unknown primary or operator

回答:


27

これにより、実行可能ビットが設定されたすべてのファイル(シンボリックリンクではない)が検索されます。

find . -perm +111 -type f

これにより、シンボリックリンク検索されます(多くの場合、同様に重要です)。

find . -perm +111 -type f -or -type l

明らかでない場合のコマンドの動作は次のとおりです。

  • find 明らかにfindプログラム(:
  • ..=現在のディレクトリ)で検索を開始するディレクトリを参照します
  • -perm +111=実行可能ビットのいずれかが設定されている場合(+「これらのビットのいずれか」を意味し111、所有者、グループ、および誰でも実行可能ビットの8進数です)
  • -type fタイプがファイルであることを意味します
  • -or ブールOR
  • -type lタイプがシンボリックリンクであることを意味します

2
-L代わりに-or -type lを使用して、リンク自体ではなく、リンク先のファイルの統計情報を返すためのstat呼び出しを発生させることができfindます。
イアンC。

このアプローチで発見した問題は、どのファイルにも実行許可があるということです。たとえば、Windowsからテキストファイルをダウンロードした後、アクセス許可が台無しになります。
イヴァンZ.シャオ14年

4

Ianの解答(10.6.8)を作成することはできませんでしたが、次の結果は期待どおりの結果になりました。

find . -type f -perm +0111 -print

更新を編集

これもうまくいくようです!

find . -type f -perm +ugo+x -print

「x」は、ユーザー/グループ/その他の指定子がなければ意味がないと思います。


シンボリック構文は新しいものでなければなりません-それを指摘してくれてありがとう。回答を更新し、オクタルを使用し、古いOS Xバージョンと下位互換性があるようにしました。
イアンC。

奇妙なことに、10.6のマンページのそのセクションは、あなたが引用したものとまったく同じです。上記の私の回答を修正しました。
ケント14年

2
結論:BDSコマンド構文は奇妙です。
イアンC。

3

OS Xのfindのmanページから:

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

必要なもの:

find . -type f -perm +0111 -print

OS XはLinuxベースではなくBSDベースであるため、Linuxディストリビューション(findそのうちの1つ)で慣れているGnuコマンドは、OS Xのものと必ずしも同じではないことに注意してください。シェルの違いは、オペレーティングシステムとオペレーティングシステムユーティリティツールの違いです。


1

非常に古い質問ですが、私は承知していますが、解決策を探してより良い答えを見つけたかもしれません。

「find」の使用に関する主な問題は、この属性が実行可能でないファイルに設定されている場合でも、実行可能に設定された属性に依存することです。

MacOSには、fileファイル情報を表示する便利な小さなコマンドラインツール「」が付属しています。たとえば、

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

ご覧のとおり、「MyProgram」は実行可能ファイルであり、適切に示されています。古い32ビットの実行可能ファイルには「executable」というフレーズも含まれているため、以下にすべての実際の実行可能ファイル(バイナリ)をリストする必要があります。

file * | grep "executable"

これが同じ質問への回答を探している人にも役立つことを願っています。

注:fileサブディレクトリを再帰する機能はないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.