Cómo eliminar bits ejecutables recursivamente de archivos (no directorios)

73

Cuando conecto una memoria USB (FAT) en mi máquina Mac o Ubuntu, todos los archivos tienen los bits ejecutables establecidos. Después de haber copiado la estructura de directorios en mi disco duro, ¿cómo elimino los bits ejecutables recursivamente solo de los archivos y los mantengo en los directorios?

Mike L.
fuente

Respuestas:

133

Con la chmodvariante de comando único GNU (en Ubuntu) (comenzando en el directorio actual):

chmod -R -x+X .

Explicación:

  • -R - operar recursivamente
  • -x - eliminar banderas ejecutables para todos los usuarios
  • +X - establecer banderas ejecutables para todos los usuarios si es un directorio

En este caso, el capital se Xaplica solo a los directorios porque todos los indicadores ejecutables fueron borrados por -x. De lo contrario, +Xestablece banderas ejecutables también si la bandera se configuró originalmente para cualquiera de los usuarios, grupos u otros.

Con BSD chmod(que está presente en Mac OS X) debe hacerlo por separado en dos comandos:

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

(Si también desea incluir archivos ocultos en el directorio principal, es probable que necesite cambiar * a. (Punto), pero no está probado).

pabouk
fuente
1
En Ubuntu 13.04 es necesario un pequeño ajuste:chmod -R a-x+X *
Eero Aaltonen
@EeroAaltonen: Gracias por la nota. Esto podría suceder si su umaskno permite xpermiso para todos. ¿Utiliza el valor predeterminado umasko lo cambió? ¿Podría por favor enviar salida de umaskcomando? Además de su solución, también existe esta posibilidad: chmod -R a-x,+X *que establecerá el xpermiso de acuerdo con su umask. Actualizaré la respuesta, pero primero me gustaría verificar el comportamiento en BSD / Mac OS X.
pabouk
@pabouk oopsie! En realidad, fue la caja de CentOs donde había configurado mi umask en 0007.
Eero Aaltonen
Esto es triste ... :( Me gusta la findvariante en la respuesta a continuación por su estilo de combinar herramientas simples que hacen una cosa bien.
mikezter
2
Use en .lugar de *si desea que esto se aplique a todos los archivos
John Magnolia
46

Si primero ingresas a la ruta correcta:

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

o

chmod -x $(find . -type f)

La búsqueda encuentra todos los archivos de tipo 'f' (que significa archivo normal) en la ruta. y luego llama a chmod -x en cada archivo. El {} se sustituye por el nombre del archivo y el \; termina el comando chmod.

Matthijs P
fuente
66
Si lo findadmite, use en -exec ... \+lugar de -exec ... \;: requerirá menos fork+ execs. Si no es así, úsalo find ... -print0 | xargs -0 ....
Ephemient
55
He usado esta técnica, pero con "-perm +111" agregado al hallazgo, por lo que solo los chmod tienen el conjunto de bits x:find . -type f -perm +111 -exec chmod -x {} \;
chrish
44
+1 @Matthijs La razón por la cual esto es mejor que la solución de pabouk es que este comando deja los directorios solos, mientras que pabouk restablece el bit ejecutable en todos los directorios. Puede haber algunos directorios que no tienen el bit ejecutable establecido, y el comando de pabouk lo establece, mientras que es posible que desee dejarlos como están.
MariusMatutiae
el segundo enfoque fallará para los caminos que contienen espacios.
MestreLion
@ephemient: si sus findapoyos -print0estoy bastante seguro de que también será compatible-exec
MestreLion
3

En Linux y Unix en una ventana de terminal o en Mac OS X, use esto en Terminal.app:

find . -type f -print0 | xargs -0 chmod -x
usuario227317
fuente
1
Esto, en esencia, no es diferente de la respuesta de Matthijs P de 2011.
slhck
¿Puedes recordar esta línea de comando? No puedo
Mike L.
Vea el comentario de ephemient debajo de la respuesta de Matthijs para ver por qué esta respuesta es útil.
PatrickT
2

La chmod -x+Xforma tampoco funcionó para mí en ubuntu, por lo tanto, escribí este script mínimo de python:

#!/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)

Si puede haber algo extra elegante, como sockets en su sistema de archivos, es posible que desee rodear el último chmod con un try / catch.

ratones
fuente