我想找到从内核角度可执行的文件类型。据我所知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
。