Chmod -R sur tous les fichiers sauf extension définie

Bonjour à tous!

Alors voilà, le titre est p-e pas très explicite alors je détaille un peu mieux :
Je cherche un moyen de changer automatiquement les droits de tous les fichiers se trouvant dans un dossier (ou dans un sous dossier de ce dossier), sauf ceux possédant une extension prédéfinie (par exemple .extension).

Par exemple si dans un dossier /home/partage j’ai les fichiers suivants:

  • toto.bmp
  • elsa.jpg
  • jacques.extension
    Et que dossier /home/partage contient un sous dossier photos, qui lui même contient les fichiers
  • noel.bmp
  • test.extension

Je voudrais lancer une commande qui changerait les droits de tous les fichiers sauf jacques.extension et test.extension.

J’ai essayé la commande suivante :

Malheureusement, comme l’a si bien dit BBT1 :

[quote]je pense que c’est le bash qui complete !(*.extension) et pas chmod.
Du coup, seul les fichiers du répertoire ou la commande est lancée voir ses .extension ignorés
et pas le reste de l’arborescence…[/quote]

A la suite de cette commande les droits du fichier jacques.extension n’auront effectivement pas été modifiés. Par contre ceux du fichier test.extension bien car il est dans un sous dossier.

Donc si vous avez des idées, je suis preneur… Merci d’avance.

Bon, j’avais pas vu le changement de topic.
Allez, je suis sympa, je te fais la syntaxe du find :

ex: effacer tous les fichiers de sauvegardes générés par emacs et qui pourrissent ton arborescence

Merci BBT1.

Bon je progresse mais c’est pas encore ça. find refuse d’évaluer l’expression ‘!(*.extension)’, faut que je cherche de ce coté.

Lorsque j’exécute la commande :

Tout se passe bien, il me renvoi les noms de fichiers se terminant par “.extension”.

Par contre quand je tape :

Il me renvoi l’erreur suivante:

find: paths must precede expression: toto.bmp Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Et si je met des guillemets (’) autour de !(.extension) pas d’erreur mais aucun résultats non plus car je suppose qu’il cherche des fichiers s’appelant réellement "!(.extension)…

Je continue de tourner et retourner le man de find dans tous les sens :slightly_smiling:

Avec -regex au lieu de -name, tu peux spécifier une expression rationelle, tu peux alors utiliser la négation ([^expression] :

Merci pour ta réponse kna.
J’ai essayé -regex aussi, et ta commande mais malheureusement ça ne fonctionne pas. Je n’ai pas de message d’erreur mais l’expression régulière que tu indiques signifie :" tous les fichiers ne se terminant pas par ‘.’ ni par ‘e’ ni par ‘x’, ni par ‘t’, etc.

Je pense qu’il faut utiliser le ! ou le -not pour que l’expression régulière soit correcte, malheureusement tous mes essais se sont soldés par des échecs jusqu’à présent.

Bash interprète bien l’expression !(*.extension) comme je le souhaite (tous les fichiers sauf ceux se terminant par “.extension”. Mais find ne l’interprète pas et j’y perds mon latin…

Je pousse un grand cri d’appel au secours :smt006 et surtout j’aimerai comprendre pourquoi ça marche pas :smt021

Effectivement ! :blush:

Je dois être bon là. EDIT : en fait, non. Même en enlevant les crochets.

find n’utilise pas les regex basiques : ils faut échapper les parenthèses faute de quoi il cherchera tout simplement… une parenthèse ! Regardes man grep, cherches « Basic vs Extended » pour avoir la liste des caractères à échapper.

Tu peux aussi utiliser find avec des regex étendues avec l’option -regextype :

EDIT : Non plus forcément.

NICKEL!!! Ça marche.

Me semblait bien qu’il devait y avoir une solution plus “esthétique” que la boucle. Dire que j’ai essayé ce -not à toutes les sauces mais chaque fois après -regex et pas avant.

Un grand merci à toi kna et à BBT1.

Me reste plus qu’à cliquer sur résolu.