web-dev-qa-db-fra.com

changer chmod pour les fichiers mais pas pour les répertoires

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

67
Ori

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.

101
paxdiablo

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.

29
Stephen C

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`
18
Arman H

via http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

"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.

2
b0x0rz

avec GNU find

find /path -type f -exec chmod 644 {} +;

2
ghostdog74