如何查找可执行文件类型?

如何查找可执行文件类型?

我想找到从内核角度可执行的文件类型。据我所知Linux上的所有可执行文件都是ELF文件。因此我尝试了以下方法:

find * | file | grep ELF

但这是行不通的;还有人有其他想法吗?

答案1

稍后编辑:只有这个可以满足 jan 的需要:谢谢惠更斯;

find . -exec file {} \; | grep -i elf

答案2

对于有限(例如嵌入式)系统上的系统,不使用file和 的替代解决方案:readelf

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46

基本上,我们输出前四个字节并将hexdump它们用作签名。然后我们可以 grep 所有类型的文件极低频使用它的签名7f454c46

或者,因为7f删除字符, , 45, 4c,46字节分别是E, L,F字符,我们也可以使用:

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"'  {} \; | grep ^delELF

另外,在这种情况head下您可以使用:hexdump

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF

答案3

和其他人一样,我也想回答一下。我的答案也是基于使用该find实用程序,但我有一个想法,它与其他答案不同。它基于这样一个事实,即-exec也可以用作搜索条件。现在,考虑到这一点,我们可以将之前的所有提案重构为这个提案:

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

即我们已将grep移至-exec.

您可能会问,这给我们带来了什么?我们可以利用该实用程序-print和其他实用程序的灵活性find。例如,我们可以根据自己的喜好格式化输出,或者使用-print0并将输出重定向到某个脚本等。

答案4

假设原来的问题指的是极低频仅文件(而不是任何其他“从内核角度来看可执行文件”),有一个更短且最有可能更快的替代方案find+ file

$ scanelf -R /SEARCH/PATH
 TYPE   FILE 
ET_DYN /SEARCH/PATH/library.so
ET_EXEC /SEARCH/PATH/app1
ET_EXEC /SEARCH/PATH/app2

它递归地搜索 ELF 文件,打印每个文件的目标文件类型和文件路径。

将搜索范围缩小到仅可执行 ELF 文件:scanelf -EET_EXEC -R /SEARCH/PATH.

抑制横幅和类型,仅保留文件路径:scanelf -EET_EXEC -RBF %F /SEARCH/PATH

相关内容