Používám-li příkaz find
takto:
find /mydir/mysubdir -executable -type f
jsou uvedeny všechny spustitelné soubory (kromě adresářů) a včetně spustitelného souboru skriptu (jako script.sh atd.). Chci udělat seznam pouze binárních spustitelných souborů.
Můžete zkusit nástroj file
. Podle manuálu:
Magické testy se používají ke kontrole souborů s daty v určitých pevných formátech. Kánonickým příkladem je binární spustitelný soubor (kompilovaný program) a.out, jehož formát je definován v a případně ve standardním adresáři include.
Možná se budete muset pohrávat s regulárním výrazem, ale něco jako:
$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'
soubor má spoustu možností, takže se možná budete chtít blíže podívat na manuálovou stránku. Použil jsem první možnost, kterou jsem zjistil, a zdálo se, že na výstup je výstup snadno zřetelný.
Zde je způsob, jak vyloučit skripty, tj. Soubory, jejichž první dva znaky jsou #!
:
find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print
U některých druhů souborů není jasné, zda je chcete klasifikovat jako skripty nebo binární, například soubory s bajtovým kódem. V závislosti na tom, jak jsou věci nastaveny, mohou nebo nemusí začínat znakem #!
. Pokud vám tyto záleží, budete muset vnitřní skript Shell složitější. Zde je například návod, jak byste mohli zahrnout binární soubory ELF a spustitelné soubory Mono a programy Objective Caml bytecode, ale nikoli jiné druhy spustitelných souborů, jako jsou skripty Shell nebo Perl nebo skripty JVM bytecode:
find -type f -executable -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*) exit 0;;
esac
exit 1
' sh {} \; -print
Jen v případě, že se ocitnete v systému s downlevelem find
(stále existují, jak píšu, vědecké klastry lotta s RHEL5!) Bez práva na aktualizaci: místo
find /mypath/ -executable -type f
ve výše uvedených vynikajících odpovědích můžete dělat např.
find /mypath/h -type f -perm -u+x
který hledá na bitech povolení. Bohužel výše uvedené pouze vyhledá soubory, pro které má uživatel spustitelný soubor, ale obvykle to pro mě funguje.