ti-enxame.com

Como encontrar todos os executáveis ​​binários recursivamente dentro de um diretório?

Se eu usar o comando find assim:

find /mydir/mysubdir -executable -type f

todos os arquivos executáveis ​​são listados (excluindo diretórios) e incluindo o arquivo de script executável (como script.sh, etc). O que eu quero fazer é listar apenas arquivos executáveis ​​binários.

48
uray

Você pode tentar o utilitário file. De acordo com a página de manual:

Os testes mágicos são usados ​​para verificar arquivos com dados em formatos fixos específicos. O exemplo canônico disso é um arquivo a.out executável binário (programa compilado), cujo formato é definido e, possivelmente, no diretório de inclusão padrão.

Você pode ter que brincar com a expressão regular, mas algo como:

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

o arquivo tem muitas opções, portanto, você pode dar uma olhada na página de manual. Eu usei a primeira opção que achei que parecia gerar uma saída fácil para grep.

45
Steven D

Aqui está uma maneira de excluir scripts, ou seja, arquivos cujos dois primeiros caracteres são #!:

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

Para alguns tipos de arquivos, não está claro se você deseja que eles sejam classificados como scripts ou binários, por exemplo, arquivos de bytecode. Dependendo de como as coisas estão configuradas, elas podem ou não começar com #!. Se isso lhe interessa, será necessário tornar o script interno do Shell mais complexo. Por exemplo, veja como você pode incluir binários ELF e executáveis ​​Mono e programas de bytecode Objective Caml, mas não outros tipos de executáveis, como scripts de shell ou scripts Perl ou programas de bytecode da JVM:

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
7

Caso você se encontre em um sistema com um nível inferior find (ainda existem, enquanto escrevo, muitos clusters científicos executando o RHEL5!) Sem os direitos de atualização: em vez de

find /mypath/ -executable -type f

nas excelentes respostas acima, você pode fazer, por exemplo,

find /mypath/h -type f -perm -u+x

que pesquisa em bits de permissão. Infelizmente, o acima exposto apenas encontra arquivos para os quais o usuário tem executável, mas isso geralmente funciona para mim.

2
TomRoche