Je dois utiliser chmod pour changer tous les fichiers de manière récursive en 664. Je voudrais ignorer les dossiers. Je pensais faire quelque chose comme ça
ls -lR | grep ^-r | chmod 664
Cela ne fonctionne pas, je suppose que je ne peux pas diriger dans chmod. Quelqu'un sait-il un moyen facile de le faire?
Merci
UNE find -exec
la réponse est bonne, mais elle souffre du défaut généralement non pertinent de créer un sous-processus distinct pour chaque fichier. Cependant, il est parfaitement fonctionnel et ne fonctionnera mal que lorsque le nombre de fichiers devient vraiment volumineux. L'utilisation de xargs
regroupera les noms de fichiers en grands groupes avant d'exécuter un sous-processus pour ce groupe de fichiers.
Vous devez juste faire attention à ce que, en utilisant xargs
, vous gérez correctement les noms de fichiers avec des espaces intégrés, des sauts de ligne ou d'autres caractères spéciaux.
Une solution qui résout ces deux problèmes est (en supposant que vous avez une implémentation find
et xargs
suffisamment décente):
find . -type f -print0 | xargs -0 chmod 644
Le -print0
oblige find
à terminer les noms de fichier sur son flux de sortie par un caractère NUL (plutôt qu'un espace) et le -0
à xargs
lui fait savoir qu'il doit s'attendre à cela comme format d'entrée.
Pour ce faire, vous pouvez également utiliser find ... -exec ...
comme suit:
find . -type f -exec chmod 644 {} \;
Le problème est que le -exec
démarre un processus chmod
pour chaque fichier. L'approche xargs
évite cela, et est supérieure à condition que vous ayez une version de find
et xargs
qui peut faire face au problème des "espaces dans les noms de chemin"; voir la réponse acceptée.
Et pour mémoire, l'utilisation de back-ticks va casser s'il y a trop de fichiers à modifier, ou si la longueur agrégée des chemins d'accès est trop grande.
Mes deux cents succincts ...
Linux:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
Cela fonctionne pour changer récursivement tous les fichiers contenus dans le répertoire courant et tous ses sous-répertoires. Si vous souhaitez cibler un autre répertoire, remplacez .
avec le chemin correct:
$ chmod 644 `find /home/my/special/folder -type f`
"find. -type f -print | xargs chmod 444" devrait fonctionner, n'est-ce pas? Sinon, trouvez. -print> myfile.sh et vi myfile.sh supprimant les répertoires (ils ne devraient pas être trop nombreux), puis 1, $ s/^/chmod 444/et sh myfile.sh.
avec GNU find
find /path -type f -exec chmod 644 {} +;