web-dev-qa-db-fra.com

Comment supprimer le bit exécutable de manière récursive à partir de fichiers (pas de répertoires)

Lorsque je connecte une clé USB (FAT) à mon ordinateur Mac ou Ubuntu, tous les fichiers ont les bits exécutables définis. Après avoir copié la structure de répertoires sur mon disque dur, comment puis-je supprimer les bits exécutables de manière récursive uniquement dans les fichiers et les conserver dans les répertoires?

73
Mike L.

Avec GNU chmod (sous Ubuntu), variante de commande unique (commençant dans le répertoire actuel):

chmod -R -x+X .

Explication:

  • -R - fonctionne de manière récursive
  • -x - supprime les indicateurs exécutables pour tous les utilisateurs
  • +X - définit des indicateurs exécutables pour tous les utilisateurs s'il s'agit d'un répertoire

Dans ce cas, la majuscule X s'applique uniquement aux répertoires, car tous les indicateurs de l'exécutable ont été effacés par -x. Sinon, +X définit le ou les indicateurs exécutables également si l'indicateur a été défini à l'origine pour un utilisateur, un groupe ou autre.

Avec BSD chmod (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 souhaitez également inclure des fichiers cachés dans le répertoire principal, vous devrez probablement remplacer * par. (Point), mais cela n’a pas été testé.)

130
pabouk

Si vous entrez d'abord dans le bon chemin:

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

ou

chmod -x $(find . -type f)

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

46
Matthijs P

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
3
user227317

La méthode chmod -x+X n'a pas fonctionné pour moi non plus 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)

S'il peut y avoir des éléments supplémentaires fantaisistes tels que des sockets dans votre système de fichiers, vous pouvez entourer le dernier chmod d'un try/catch.

2
mic_e