Como posso encontrar apenas os arquivos executáveis em um determinado diretório no Linux?
linux
command-line
bash
find
HaiYuan Zhang
fonte
fonte
file
comando padrão ?ls -l | egrep '^[^d]..x..x..x.*$'
O acima irá listar todos os executáveis (para todos / usuário e grupo) no diretório atual. Nota : A-executable
opção não funciona em um Mac, portanto, a solução alternativa acima.-rwxr-x---
), que ainda é executável para alguns usuários.Respostas:
A verificação de arquivos executáveis pode ser feita com
-perm
(não recomendado) ou-executable
(recomendado, pois leva em consideração a ACL). Para usar a-executable
opção:se você deseja encontrar apenas arquivos executáveis e diretórios não pesquisáveis, combine com
-type f
:fonte
-type x
.find: invalid predicate -executable'
on RHELUse a
-perm
opção de localização. Isso encontrará arquivos no diretório atual que são executáveis pelo proprietário, pelos membros do grupo ou por outros:Editar:
Acabei de encontrar outra opção que está presente pelo menos no GNU find 4.4.0:
Isso deve funcionar ainda melhor porque as ACLs também são consideradas.
fonte
find: invalid mode
/ U = x, G = x, o = x'`-perm /111
pode ser a versão mais portátil.Eu sei que a pergunta 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 GNU não / Sistema Linux).
Testado no macOS 10.12.5
fonte
Eu tenho outra abordagem, caso o que você realmente queira seja fazer algo com arquivos executáveis - e não necessariamente forçar a busca a se filtrar:
Eu prefiro isso porque não depende de
-executable
qual plataforma é específica; e não depende do-perm
que é um pouco misterioso, um pouco específico da plataforma e, conforme escrito acima, exige que o arquivo seja executável para todos (não apenas para você).Isso
-type f
é importante porque os diretórios * nix precisam ser executáveis para serem percorridos, e quanto mais a consulta estiver nofind
comando, mais memória será eficiente.De qualquer forma, basta oferecer outra abordagem, já que * nix é a terra de um bilhão de abordagens.
fonte
find -perm
, localiza arquivos com qualquer bit de permissão de execução definido. (2) Por outro lado, esta resposta encontra apenas arquivos para os quais o usuário atual possui permissão de execução. É verdade que pode ser o que o OP quer, mas não está claro. ... (continua)`…`
para$(…)
- veja isso , isso e isso . (4) Mas não façafor i in $(find …); do …
; falha nos nomes de arquivos que contêm espaço (s). Em vez disso, façafind … -exec …
. (5) E, quando você trabalha com variáveis de shell, sempre as aspas (entre aspas duplas), a menos que você tenha um bom motivo para não fazê-lo e tenha certeza de que sabe o que está fazendo.-perm
argumento como exigindo todos os três, não um deles. Além disso, obrigado pela entrada em proteger argumentos de shell, isso é tudo que eu não sabia.for i in
encontre. tipo f; do [ -x $i ] && echo "$i is executable"; done
; você está faltando o <dir> parte, que eu uso um ponto (.)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:
fonte
-name "*"
não tem efeitofind
- ele normalmente encontra todos os arquivos que não são eliminados pelos testes.Como um fã de um forro ...
Usando 'xargs' para obter a saída do comando find (usando print0 para garantir que os nomes de arquivos com espaços sejam manipulados corretamente). Agora temos uma lista de arquivos executáveis e os fornecemos, um por um, como parâmetro para o comando 'file'. Então grep para o termo ASCII para ignorar binários. Substitua -executable no comando find por qual estilo você prefere (consulte as respostas anteriores) ou o que funciona no seu 'NIX OS
Eu exigi o acima para encontrar arquivos com avaliação em scripts pertencentes ao root, então criei o seguinte para ajudar a encontrar pontos fracos da escalação privada onde o usuário root executa scripts com parâmetros inseguros ...
fonte
file
relata a codificação, para que um script python possa ser relatado comoa /usr/bin/python script, UTF-8 Unicode text executable
.find ... | xargs file -b | grep -v '^ELF'
poderia funcionar melhor para identificar os não binários.Criei uma função
~/.bashrc
hoje à noite para encontrar arquivos executáveis que não estão no caminho do sistema e nem nos diretórios:A vantagem é que ele pesquisará três distros do Linux e uma instalação do Windows em menos de um segundo, onde o
find
comando leva 15 minutos.Por exemplo:
Ou para um diretório inteiro e todos os seus subs:
fonte