Encontre todos os arquivos executáveis ​​dentro de uma pasta no terminal

17

Eu tenho uma pasta myfolderque contém uma enorme hierarquia de arquivos / pastas.
Como encontrar todos os arquivos executáveis ​​dentro desta pasta?

No Ubuntu, isso funciona: find . -executable -type f

Mas o Mac OS X Mavericks (que também usa bash) falha ao obtê-lo:

find: -executable: unknown primary or operator
Nicolas Raoul
fonte

Respostas:

27

Isso encontrará todos os arquivos (não links simbólicos) com o conjunto de bits executável:

find . -perm +111 -type f

Isto irá também encontrar links simbólicos (que muitas vezes são igualmente importantes)

find . -perm +111 -type f -or -type l

Aqui está como o comando funciona, se não for óbvio:

  • find é obviamente o programa find (:
  • .refere-se ao diretório para começar a encontrar ( .= diretório atual)
  • -perm +111= com qualquer um dos bits executáveis ​​definidos ( +significa "qualquer um desses bits", 111é o octal do bit executável no proprietário, grupo e qualquer pessoa)
  • -type fsignifica que o tipo é um arquivo
  • -or OR booleano
  • -type lsignifica que o tipo é um link simbólico
drfrogsplat
fonte
2
Você pode usar, em -Lvez de, -or -type lpara fazer com que as statchamadas feitas findretornem as estatísticas do arquivo vinculado, não o link em si.
Ian C.
O problema que encontrei com essa abordagem é que qualquer arquivo pode ter a permissão de execução. Por exemplo, depois de baixar algum arquivo de texto do Windows, a permissão é alterada.
Ivan Z. Xiao
4

Não consegui fazer a resposta de Ian funcionar (10.6.8), mas, a seguir, foram apresentados os resultados esperados:

find . -type f -perm +0111 -print

editar atualização

Isso parece funcionar também!

find . -type f -perm +ugo+x -print

Eu acho que o "x" não tem sentido sem o usuário / grupo / outros especificadores.

Kent
fonte
A sintaxe simbólica deve ser nova - obrigado por apontar isso. Eu atualizei minha resposta para que ele use octais e seja compatível com versões anteriores do OS X.
Ian C.
Curiosamente, essa seção da página de manual 10.6 é exatamente a mesma que você citou ... o que foi suficiente para me fazer ir um pouco mais fundo e ver o que diabos estava acontecendo. Alterou minha resposta acima.
Kent
2
Conclusão: A sintaxe do comando BDS é estranha.
Ian C.
3

Na página do manual para localizar no OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Então você precisa:

find . -type f -perm +0111 -print

Lembre-se de que o OS X é baseado em BSD , não no Linux; portanto, os comandos do Gnu com os quais você está acostumado nas distribuições Linux (das quais findé uma delas) não são necessariamente os mesmos que no OS X. Isso não é uma diferença de shell, é uma diferença de sistema operacional / utilitário de sistema operacional.

Ian C.
fonte
1

Sei que uma pergunta muito antiga, mas procurando uma solução, posso ter encontrado uma resposta melhor.

O principal problema com o uso de "localização" é que ele depende de um atributo definido como executável, mesmo que esse atributo esteja definido para um arquivo não executável.

O MacOS vem com uma pequena ferramenta útil de linha de comando " file", que exibe informações do arquivo, por exemplo:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Como você pode ver, 'MyProgram' é um executável e bem indicado como tal. Como os executáveis ​​antigos de 32 bits também terão a frase "executável", o seguinte deve listar todos os executáveis ​​verdadeiros (binários):

file * | grep "executable"

Espero que isso seja útil para alguém que procura uma resposta para a mesma pergunta.

Nota: fileparece não ter uma função para recursar através de subdiretórios.

Hanzaplastique
fonte