it-swarm-eu.dev

Jak najít všechny binární spustitelné soubory rekurzivně v adresáři?

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ů.

48
uray

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ý.

45
Steven D

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.

2
TomRoche