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 ?
Réponses
Trop de publicités?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é).
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.
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.