2010-11-22 31 views

Répondre

43

utilisez find:

find . -name "*.sh" -exec chmod +x {} \; 
+0

la ligne de commande est difficile à mémoriser ou à retenir, je dois venir et visiter cette page souvent pour voir la syntaxe. Avez-vous une façon de vous souvenir de cette commande? – ivanceras

+0

Je ne me souviens pas de beaucoup de commandes. Donc, je construis des scripts qui acceptent les paramètres. – Nathan

+1

Pour ceux qui sont confus au sujet de ce que la commande * fait *, voir la réponse de chappjc, ci-dessous, pour un indice, au moins. –

6

Essayez d'utiliser la combinaison glorieuse de trouver avec xargs.

find . -iname \*.sh | xargs chmod +x 

Le . est le répertoire pour commencer dans, dans ce cas, le répertoire de travail.

+0

Ou vous pouvez utiliser -exec dans le cas simple, comme dans l'exemple d'ennuikiller. 'xargs' a un peu plus de puissance pour des utilisations plus compliquées. – Orbling

+1

Ceci est plus efficace que trouver ... -exec ... Voir http://en.wikipedia.org/wiki/Xargs – Nathan

+0

@Nathan Merci d'avoir souligné cette distinction importante. En lisant cela, j'ai découvert une syntaxe new 'find' qui obtient le meilleur des deux mondes (voir [ma réponse] (http://stackoverflow.com/a/32618572/2778484) pour plus de détails). – chappjc

2

Avec les versions modernes de find, vous obtenez les avantages d'une approche xargs qui évite plusieurs appels à la commande (chmod). La commande est seulement légèrement différente.

find . -name "*.sh" -exec chmod +x {} +

Snip de find docs Arch 01/09/2015 (accent ajouté par moi):

-exec command {} +

Cette variante de l'action -exec exécute la commande spécifiée sur la sélectionnée fichiers, mais la ligne de commande est construite en ajoutant chaque nom de fichier sélectionné à la fin; le nombre total d'invocations de la commande sera beaucoup moins que le nombre de fichiers correspondants. La ligne de commande est construite de la même manière que xargs construit ses lignes de commande. Une seule instance de {} est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.