
我想找到從內核角度可執行的文件類型。據我所知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
。