Question 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 des bits exécutables. Après avoir copié la structure du répertoire sur mon disque dur, comment puis-je supprimer les bits exécutables de manière récursive des fichiers et les conserver dans les répertoires?


71
2018-01-18 09:15


origine


duplicata possible de Comment chmod tous les répertoires, sauf les fichiers (récursivement)? - G-Man


Réponses:


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

chmod -R -x+X .

Explication:

  • -R - opérer récursivement
  • -x - supprimer les indicateurs exécutables pour tous les utilisateurs
  • +X - définir des drapeaux exécutables pour tous les utilisateurs s'il s'agit d'un répertoire

Dans ce cas la capitale X s'applique uniquement aux répertoires car tous les indicateurs exécutables ont été effacés par -x. Autrement +X définit les indicateurs exécutables également si le drapeau a été défini à l'origine pour un utilisateur, un groupe ou d'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 souhaitez également inclure des fichiers cachés dans le répertoire principal, vous devez probablement passer * à. (Point), mais il n’a pas été testé.)


124
2018-06-08 19:32



Sur Ubuntu 13.04, une modification mineure est nécessaire: chmod -R a-x+X * - Eero Aaltonen
@EeroAaltonen: Merci pour la note. Cela pourrait arriver si votre umask ne permet pas de x permission pour tous. Utilisez-vous les paramètres par défaut umask ou l'avez-vous changé? Pourriez-vous s'il vous plaît envoyer la sortie de umask commander? Outre votre solution, il y a aussi cette possibilité: chmod -R a-x,+X * qui définira le x permission selon votre umask. Je mettrai à jour la réponse mais je voudrais d'abord vérifier le comportement dans BSD / Mac OS X. - pabouk
@pabouk oopsie! C'était en fait la boîte des CentOs où j'avais mis mon umask à 0007. - Eero Aaltonen
C'est juste triste ... :( J'aime la find variante dans la réponse ci-dessous pour son style de combiner des outils simples qui font One Thing Well. - mikezter
Utilisation . au lieu de * si vous voulez que cela s'applique à tous les fichiers - John Magnolia


Si vous cd 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 régulier) dans le chemin. puis appelle chmod -x sur chaque fichier. Le {} se substitue au nom de fichier et au \; termine la commande chmod.


43
2018-01-18 09:33



Si ton find le supporte, utilise -exec ... \+ au lieu de -exec ... \; - il faudra moins fork+execs. Si ce n'est pas le cas, utilisez find ... -print0 | xargs -0 .... - ephemient
J'ai utilisé cette technique, mais avec "-perm +111" ajouté à la recherche, il n'y a que ceux de chmod qui ont le jeu x-bit: find . -type f -perm +111 -exec chmod -x {} \; - chrish
+1 @Matthijs La raison pour laquelle c'est mieux que la solution de pabouk est que cette commande laisse les répertoires seuls, tandis que pabouk redéfinit le bit exécutable dans tous les répertoires. Il peut y avoir certains répertoires dont le bit exécutable n'est pas défini, et la commande de pabouk le définit, alors que l’on peut souhaiter les laisser tels quels. - MariusMatutiae
la 2ème approche échouera pour les chemins contenant des espaces. - MestreLion
@ephemient: si votre find les soutiens -print0 Je suis sûr que ça va aussi supporter -exec - MestreLion


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
2018-05-28 11:12



Ce n'est, en substance, pas différent de la réponse de Matthijs P de 2011. - slhck
Pouvez-vous vous souvenir de cette ligne de commande? Je ne peux pas. - Mike L.
Voir le commentaire d'ephemient ci-dessous la réponse de Matthijs pour voir pourquoi cette réponse est utile. - PatrickT


le chmod -x+X façon ne fonctionnait pas non plus sur Ubuntu non plus, donc j'ai écrit ce script python minimal:

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


2
2018-03-26 04:33