Como remover bit executável de forma recursiva a partir de arquivos (não diretórios)

71

Quando eu plug-in um stick USB (FAT) na minha máquina Mac ou Ubuntu, todos os arquivos têm os bits executáveis definidos. Depois de ter copiado a estrutura do diretório para o meu disco rígido, como remover os bits executáveis recursivamente apenas dos arquivos e mantê-los nos diretórios?

    
por Mike L. 18.01.2011 / 10:15

4 respostas

126

Com variante de comando único do GNU chmod (no Ubuntu) (iniciando no diretório atual):

chmod -R -x+X .

Explicação:

  • -R - opera recursivamente
  • -x - remove flags executáveis para todos os usuários
  • +X - definir flags executáveis para todos os usuários, se for um diretório

Nesse caso, o capital X se aplica somente aos diretórios porque todos os sinalizadores executáveis foram limpos por -x . Caso contrário, +X definirá os sinalizadores de executável também se o sinalizador foi originalmente definido para qualquer usuário, grupo ou outros.

Com o BSD chmod (presente no Mac OS X), você precisa fazê-lo separadamente em dois comandos:

sudo chmod -R -x * && sudo chmod -R +X *

(Se você quiser incluir arquivos ocultos no diretório principal, provavelmente precisará alterar * para. (ponto), mas não foi testado.)

    
por 08.06.2012 / 21:32
43

Se você criar um cd no caminho correto primeiro:

find . -type f -exec chmod -x {} \;

ou

chmod -x $(find . -type f)

O achado encontra todos os arquivos do tipo 'f' (o que significa arquivo regular) no caminho. e, em seguida, chama chmod -x em cada arquivo. O {} é substituído pelo nome do arquivo e pelo \; termina o comando chmod.

    
por 18.01.2011 / 10:33
3

No Linux e Unix em uma janela de terminal ou no Mac OS X, use isso em Terminal.app:

find . -type f -print0 | xargs -0 chmod -x
    
por 28.05.2013 / 13:12
2

O chmod -x+X way não funcionou para mim no Ubuntu, portanto, escrevi este script python mínimo:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

Se houver algum material extra sofisticado, como soquetes em seu sistema de arquivos, você pode querer cercar o último chmod com um try / catch.

    
por 26.03.2013 / 05:33

Tags