我有一个myfolder
包含大量文件/文件夹层次结构的文件夹。
如何在此文件夹中查找所有可执行文件?
在Ubuntu上,这有效: find . -executable -type f
但是Mac OS X Mavericks(也使用bash
)无法获取它:
find: -executable: unknown primary or operator
我有一个myfolder
包含大量文件/文件夹层次结构的文件夹。
如何在此文件夹中查找所有可执行文件?
在Ubuntu上,这有效: find . -executable -type f
但是Mac OS X Mavericks(也使用bash
)无法获取它:
find: -executable: unknown primary or operator
Answers:
这将查找设置了可执行位的所有文件(不是符号链接):
find . -perm +111 -type f
这也将找到符号链接(通常同样重要)
find . -perm +111 -type f -or -type l
如果命令不明显,请按照以下步骤操作:
find
显然是查找程序(:.
指的是要开始查找的目录(.
=当前目录)-perm +111
=设置了任何可执行位(+
表示“这些位中的任何一个”,111
是所有者,组和任何人上的可执行位的八进制)-type f
表示类型是文件-or
布尔值OR-type l
表示类型是符号链接 -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中的相同。这不是外壳差异,是操作系统/操作系统实用程序差异。
我知道这是一个非常老的问题,但是寻找解决方案时,我可能找到了一个更好的答案。
使用“ 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
似乎没有通过子目录递归的功能。
-L
而不是-or -type l
引起任何stat
调用,find
以返回链接到的文件的统计信息,而不是链接本身。