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

40

Se eu usar o comando find desta forma:

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.

    
por uray 02.09.2010 / 00:27

3 respostas

40

Você pode tentar o utilitário file . De acordo com o manpage:

The magic tests are used to check for files with data in particular fixed formats. The canonical example of this is a binary executable (compiled program) a.out file, whose format is defined in , and possibly in the standard include directory.

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, convém dar uma olhada mais de perto na página do manual. Eu usei a primeira opção que eu achei que parecia saída facilmente para o grep.

    
por 02.09.2010 / 04:15
5

Aqui está uma maneira de excluir scripts, ou seja, arquivos cujos primeiros dois 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 classificá-los como scripts ou binários, por exemplo, arquivos bytecode. Dependendo de como as coisas estão configuradas, elas podem ou não começar com #! . Se isso for importante para você, você terá que tornar o script de shell interno mais complexo. Por exemplo, aqui está como você pode incluir binários ELF e executáveis Mono e programas de bytecode do 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
    
por 02.09.2010 / 00:50
1

Apenas para o caso de você se encontrar em um sistema com um nível inferior find (ainda há, como 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 procura bits de permissão. Infelizmente o acima só encontra arquivos para os quais o usuário tenha executável, mas isso geralmente funciona para mim.

    
por 15.10.2013 / 23:32