Como posso encontrar apenas os arquivos executáveis em um determinado diretório no Linux?

128

Como posso encontrar apenas os arquivos executáveis em um determinado diretório no Linux?

    
por HaiYuan Zhang 10.09.2009 / 13:56

6 respostas

132

A verificação dos arquivos executáveis pode ser feita com -perm (não recomendado) ou -executable (recomendado, pois a ACL é considerada). Para usar a opção -executable :

find <dir> -executable

se você quiser encontrar apenas arquivos executáveis e diretórios não pesquisáveis, combine com -type f :

find <dir> -executable -type f
    
por 10.09.2009 / 13:59
29

Use a opção -perm da pesquisa. Isso localizará os arquivos no diretório atual que são executáveis pelo proprietário, pelos membros do grupo ou por outros:

find . -perm /u=x,g=x,o=x

Editar:

Acabei de encontrar outra opção que está presente pelo menos no GNU find 4.4.0:

find . -executable

Isso deve funcionar ainda melhor porque as ACLs também são consideradas.

    
por 10.09.2009 / 17:55
7

Eu sei que a questão menciona especificamente o Linux, mas como é o primeiro resultado no Google, eu só queria adicionar a resposta que estava procurando (por exemplo, se você é - como eu no momento) forçado pelo seu empregador a usar um sistema não GNU / Linux).

Testado no macOS 10.12.5

find . -perm +111 -type f
    
por 01.06.2017 / 08:59
3

Eu tenho outra abordagem, caso você realmente queira apenas fazer algo com arquivos executáveis - e não necessariamente forçar a busca a se filtrar:

for i in 'find -type f'; do [ -x $i ] && echo "$i is executable"; done

Eu prefiro isso porque não depende de -executable , que é específico da plataforma; e não depende de -perm , que é um pouco arcano, um pouco específico da plataforma e, como descrito acima, requer que o arquivo seja executável para todos (não apenas para você).

O -type f é importante porque nos diretórios * nix tem que ser executável para ser percorrido, e quanto mais a consulta estiver no comando find , mais memória eficiente seu comando será.

De qualquer forma, apenas oferecendo uma outra abordagem, já que * nix é a terra de um bilhão de abordagens.

    
por 24.04.2016 / 04:38
2

Um arquivo marcado como executável não precisa ser um arquivo ou objeto executável ou carregável.

Aqui está o que eu uso:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print
    
por 26.03.2014 / 08:52
1

Como um fã de um forro ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Usando 'xargs' para obter a saída do comando find (usando print0 para garantir que os nomes dos arquivos com espaços sejam manipulados corretamente). Agora temos uma lista de arquivos que são executáveis e nós os fornecemos, um por um, como o parâmetro para o comando 'file'. Então grep para o termo ASCII ignorar binários. Por favor, substitua -executável no comando find com o estilo que você preferir (veja respostas anteriores) ou o que funciona no seu 'NIX OS

Eu exigi o acima para encontrar arquivos com eval em scripts de propriedade de root, então criei o seguinte para ajudar a encontrar pontos fracos de escalação priv em que o usuário root executa scripts com parâmetros inseguros ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
    
por 09.07.2017 / 14:31