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

Je dois utiliser chmod pour changer tous les fichiers récursivement à 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 parce que je ne peux pas entrer dans chmod Quelqu’un sait-il un moyen facile de faire cela?

Merci

Une réponse find -exec est une bonne mais elle souffre de la lacune généralement non pertinente qui crée un sous-processus distinct pour chaque fichier. Cependant, il est parfaitement fonctionnel et ne fonctionnera que lorsque le nombre de fichiers devient vraiment important. L’utilisation de xargs regroupera les noms de fichiers en grands groupes avant d’exécuter un sous-processus pour ce groupe de fichiers.

Il suffit de faire attention en utilisant xargs pour gérer correctement les noms de fichiers avec des espaces incorporés, des nouvelles lignes ou d’autres caractères spéciaux.

Une solution qui résout ces deux problèmes est (en supposant que vous ayez une implémentation de xargs et une find assez correctes):

 find . -type f -print0 | xargs -0 chmod 644 

-print0 provoque la find de terminaison des noms de fichiers sur son stream de sortie avec un caractère NUL (plutôt qu’un espace) et le -0 à xargs permet de savoir qu’il doit s’attendre à cela en tant que format d’entrée.

Une autre façon de faire est d’utiliser find ... -exec ... comme suit:

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

Le problème est que -exec lance un processus chmod pour chaque fichier. L’approche xargs évite cela et est supérieure à condition que vous ayez une version de find et de xargs capable de résoudre le problème des “espaces dans les chemins”; voir la réponse acceptée.

Et pour mémoire, l’utilisation de back-ticks va se briser s’il y a trop de fichiers à modéliser ou si la longueur agrégée des chemins est trop grande.

Mon succinct deux centimes …

Linux:

 $ chmod 644 `find -type f` 

OSX:

 $ chmod 644 `find . -type f` 

Cela fonctionne pour modifier récursivement tous les fichiers contenus dans le répertoire en cours et tous ses sous-répertoires. Si vous souhaitez cibler un répertoire différent, remplacez-le . avec le bon chemin:

 $ chmod 644 `find /home/my/special/folder -type f` 

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 doivent pas être trop nombreux), puis 1, $ s / ^ / chmod 444 / et sh myfile.sh.

avec GNU find

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