Isso usa find para procurar por arquivos regulares que tenham o bit executável definido. Em seguida, testa-os com o comando file para ver se eles são realmente executáveis ou não. Se não, corremos chmod a-x neles:
find . -type f -executable \( -exec sh -c 'file -b "$1" | grep -q executable' Test {} \; -o -exec chmod a-x {} \; \)
Como você pode ver, esse comando find tem duas expressões -exec conectadas a um operador lógico-OR.
Como funciona
-
-type f -executableIsso diz ao find para procurar apenas pelos arquivos regulares que possuem o bit executável definido.
-
\(Isso começa um grupo.
Por padrão,
findcondições são AND-ed juntas e AND é mais restrito que OR. Nesse caso, queremos vincular apenas os dois comandos-execa seguir junto com um OR. Para fazer isso, precisamos de um grupo. -
-exec sh -c 'file -b "$1" | grep -q executable' Test {} \;Isso tem o programa
fileexaminar cada arquivo egrepverifica se a stringexecutableestava na saída do comandofile.Acima,
Testserve como o nome do programa ($0) para o scriptsh -c. (Para uma discussão sobre$0esh -c, consulte esta questão .Aqui está um exemplo de saída do comando
file:$ file -b bash ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0e188133c8cc5187e22eabd27cbcf46f32060fe3, stripped $ file -b which POSIX shell script, ASCII text executableComo você pode ver,
fileé inteligente o suficiente para identificar como executáveis não apenas arquivos ELF, mas também uma grande variedade de arquivos de script. -
-oIsso é lógico-OR. Isso significa que o comando a seguir só será executado se
filenão identificar o arquivo como um executável. -
-exec chmod a-x {} \;Isso remove o bit executável.
-
\)Isso diz ao
findque chegamos ao final dos comandos agrupados.
Limitações
Conforme descrito em man magic , o programa file funciona examinando as cadeias de caracteres em um arquivo. Muitos arquivos têm cadeias muito distintas. Um executável ELF, por exemplo, começa com os caracteres hexadecimais 7f 45 4c 46 . Os gráficos jpeg e png têm marcadores similarmente distintos. file não analisa ou analisa completamente um arquivo e, conseqüentemente, para alguns arquivos, no entanto, a mágica falha. Como Ayrat aponta nos comentários, file interpreta erroneamente o seguinte:
$ cat tmp.py
Now is the time for all good men
to come to the aid of the party.
from xxx import yyy
$ file tmp.py
tmp.py: Python script, ASCII text executable