2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170
Advertisement

Como posso encontrar apenas os ficheiros executáveis sob um determinado directório no Linux?

Advertisement

Como posso encontrar apenas os ficheiros executáveis sob um determinado directório no Linux?

Advertisement
Advertisement

Respostas (7)

170
170
170
2009-09-10 11:59:26 +0000

A verificação de ficheiros executáveis pode ser feita com -perm (não recomendado) ou -executable (recomendado, pois tem em conta o ACL). Para utilizar a opção -executable:

find <dir> -executable

se quiser encontrar apenas ficheiros executáveis e directórios não pesquisáveis, combine com -type f:

find <dir> -executable -type f
35
35
35
2009-09-10 15:55:13 +0000

Use a opção find’s -perm. Isto irá encontrar ficheiros no directório actual que são executáveis pelo seu dono, por membros do grupo ou por outros:

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

Editar:

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

find . -executable

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

16
Advertisement
16
16
2017-06-01 06:59:33 +0000
Advertisement

Sei que a pergunta menciona especificamente o Linux, mas como é o primeiro resultado no Google, só queria acrescentar a resposta que procurava (por exemplo, se for - como eu neste momento - obrigado pelo seu empregador a utilizar um sistema não GNU/Linux).

Testado em macOS 10.12.5

find . -perm +111 -type f
3
3
3
2016-04-24 02:38:26 +0000

Eu tenho outra abordagem, caso o que você realmente quer é apenas fazer algo com ficheiros executáveis - e não necessariamente forçar a procura para se filtrar:

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

Prefiro isto 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 escrito acima requer que o ficheiro seja executável para todos (não apenas para si).

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

De qualquer forma, apenas oferecendo outra abordagem, uma vez que *nix é a terra de mil milhões de abordagens.

2
Advertisement
2
2
2014-03-26 07:52:24 +0000
Advertisement

Um ficheiro marcado como executável não precisa de ser um ficheiro ou objecto 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
1
1
1
2017-07-09 12:31:14 +0000

Como ventilador do único liner…

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

Usando ‘xargs’ para tirar a saída do comando find (usando print0 para garantir que os nomes de arquivos com espaços são manuseados corretamente). Temos agora uma lista de ficheiros que são executáveis e fornecemos, um a um, como parâmetro para o comando ‘file’. Depois o grep para o termo ASCII para ignorar os binários. Por favor substitua -executable no comando find por qual estilo prefere (ver respostas anteriores) ou o que funciona no seu ‘NIX OS

Eu exigi o acima descrito para encontrar ficheiros com eval em scripts propriedade do root, por isso criei o seguinte para ajudar a encontrar pontos fracos de escalada de privacidade onde o utilizador root corre 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 &
0
Advertisement
0
0
2019-06-06 00:08:27 +0000
Advertisement

Esta noite criei uma função em ~/.bashrc para encontrar ficheiros executáveis não no caminho do sistema e não em directórios:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
        && echo "executable: $1"' _ {}
} # xlocate ()

A vantagem é que vai procurar três distros Linux e uma instalação Windows num segundo em que o comando find demora 15 minutos.

Por exemplo:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real 0m0.504s
user 0m0.487s
sys 0m0.018s

Ou para um directório inteiro e todos os seus subs:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real 0m0.741s
user 0m0.705s
sys 0m0.032s
Advertisement

Questões relacionadas

6
10
11
7
2
Advertisement