En ce qui concerne la find
commande, vous pouvez également simplement ajouter plusieurs -exec
commandes à la suite:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Notez que cette commande est, dans son résultat, équivalente à utiliser
fichier chgrp -v new_group && fichier 770 de chmod -v
sur chaque fichier.
Tous les find
paramètres tels que l » -name
, -exec
, -size
et ainsi de suite, sont en fait des tests : find
continuera à les exécuter un par un, tant que la chaîne jusqu'à présent a évalué à vrai . Ainsi, chaque -exec
commande consécutive n’est exécutée que si les précédentes ont renvoyé la valeur true (c’est-à-dire le 0
statut de sortie des commandes). Mais find
comprend également les opérateurs logiques tels que ou ( -o
) et non ( !
). Par conséquent, pour utiliser une chaîne de -exec
tests quels que soient les résultats précédents, il faudrait utiliser quelque chose comme ceci:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
rozcietrzewiacz
la source
'{}'
(apostrophes autour des accolades), rendez-la source
-c
'étrange traitement de 0 $ me font penser que c'est faux à chaque fois que j'y jette un coup d'œil, mais c'est tout à fait correct.sh -c
.Votre commande est d'abord analysée par le shell en deux commandes séparées par un
;
, ce qui équivaut à une nouvelle ligne:Si vous voulez exécuter une commande shell, appelez explicitement un shell avec
bash -c
(oush -c
peu importe que le shell soit spécifiquement bash):Notez l'utilisation de
{}
comme argument pour le shell; c'est l'argument zéro (qui est normalement le nom du shell ou du script, mais peu importe ici), et donc référencé par"$0"
.Vous pouvez transmettre plusieurs noms de fichiers au shell à la fois et faire en sorte que celui-ci les parcoure, ce sera plus rapide. Ici, je passe
_
comme nom de script et les arguments suivants sont des noms de fichiers, quifor x
(un raccourci pourfor x in "$@"
) itèrent.Notez que depuis bash 4 ou en zsh, vous n'avez pas besoin de trouver du tout ici. Dans bash, exécutez
shopt -s globstar
(mettez-le dans votre~/.bashrc
) pour l'activer**/
pour un répertoire glob récursif. (Dans zsh, cela est actif tout le temps.) Puisou si vous voulez que les fichiers soient itérés dans l'ordre
Une différence avec la
find
commande est que le shell ignore les fichiers de points (fichiers dont le nom commence par a.
). Pour les inclure, dans bash, premier ensembleGLOBIGNORE=.:..
; dans zsh, utilisez**/*(D)
comme motif glob.la source
sh -c
.