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`
“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 {} +;