103 votes

Comment supprimer le bit exécutable récursivement des fichiers (pas des répertoires)

Lorsque je branche une clé USB (FAT) sur ma machine Mac ou Ubuntu, tous les fichiers ont les bits exécutables définis. Après avoir copié la structure des répertoires sur mon disque dur, comment puis-je enlever les bits exécutables récursivement des fichiers et les garder dans les répertoires ?

173voto

Avec GNU chmod (sur Ubuntu) variante à commande unique (à partir du répertoire courant) :

chmod -R -x+X .

Explication :

  • -R - fonctionner de manière récursive
  • -x - supprimer les drapeaux exécutables pour tous les utilisateurs
  • +X - définir les drapeaux d'exécutabilité pour tous les utilisateurs si c'est un répertoire

Dans ce cas, le capital X ne s'applique qu'aux répertoires car tous les drapeaux exécutables ont été effacés par -x . Sinon, +X définit le(s) drapeau(s) exécutable(s) également si le drapeau a été initialement défini pour l'un des utilisateurs, groupes ou autres.

Avec BSD chmod (qui est présent sur Mac OS X) vous devez le faire séparément en deux commandes :

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

(Si vous voulez inclure les fichiers cachés dans le répertoire principal également, vous devrez probablement changer * en . (point), mais ce n'est pas testé).

49voto

borjab Points 1839

Si vous vous dirigez d'abord vers le bon chemin :

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

ou

chmod -x $(find . -type f)

Le find trouve tous les fichiers de type 'f' (ce qui signifie fichier régulier) dans le chemin . et appelle ensuite chmod -x sur chaque fichier. Le {} est remplacé par le nom du fichier et le \ ; termine la commande chmod.

4voto

Peter Schofield Points 624

Sous Linux et Unix dans une fenêtre de terminal ou Sous Mac OS X, utilisez ceci dans Terminal.app :

find . -type f -print0 | xargs -0 chmod -x

2voto

ryan Points 523

El chmod -x+X n'a pas non plus fonctionné pour moi sur ubuntu, j'ai donc écrit ce script minimal en 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 votre système de fichiers contient des éléments supplémentaires tels que des sockets, vous pouvez entourer le dernier chmod d'un try/catch.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X