在终端中的文件夹中查找所有可执行文件


19

我有一个myfolder包含大量文件/文件夹层次结构的文件夹。
如何在此文件夹中查找所有可执行文件?

在Ubuntu上,这有效: find . -executable -type f

但是Mac OS X Mavericks(也使用bash)无法获取它:

find: -executable: unknown primary or operator

Answers:


30

这将查找设置了可执行位的所有文件(不是符号链接):

find . -perm +111 -type f

将找到符号链接(通常同样重要)

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

如果命令不明显,请按照以下步骤操作:

  • find 显然是查找程序(:
  • .指的是要开始查找的目录(.=当前目录)
  • -perm +111=设置了任何可执行位(+表示“这些位中的任何一个”,111是所有者,组和任何人上的可执行位的八进制)
  • -type f表示类型是文件
  • -or 布尔值OR
  • -type l表示类型是符号链接

2
您可以使用-L而不是-or -type l引起任何stat调用,find以返回链接到的文件的统计信息,而不是链接本身。
伊恩C.

我发现这种方法的问题是任何文件都可以具有运行权限。例如,从Windows下载一些文本文件后,权限被弄乱了。
Ivan Z. Xiao

5

我无法使Ian的答案有效(10.6.8),但是以下给出了预期的结果:

find . -type f -perm +0111 -print

编辑更新

这似乎也可以!

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

我猜没有用户/组/其他说明符,“ x”是没有意义的。


符号语法必须是新语法-感谢您指出这一点。我更新了答案,使其使用八进制,并且与较旧的OS X版本向后兼容。
伊恩C.

奇怪的是,10.6联机帮助页中的这一部分与您引用的内容完全相同。在上面修改了我的回复。
肯特

2
结论:BDS命令语法很奇怪。
伊恩C.

3

用于查找OS X的手册页

 -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是基于BSD的,而不是基于Linux的,因此您在Linux发行版中使用的Gnu命令(其中find之一)不一定与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似乎没有通过子目录递归的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.