Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/02/2020, à 13:38

Christophe C

Modifier les droits d'1 type de fichier dans une arborescence

Je voudrais faire un chmod 644 de façon récursive pour un type de fichier se trouvant dans une série de sous-répertoires qui sont en chmod 755

Par exemple les fichiers *.mo dans des sous-rep de /usr/share/locale/...

Par contre, je veux que les sous-répertoires eux-même et les autres fichiers restent en 755.

J'ai testé sudo chmod 644 usr/share/locale/*.mo -v -R, et évidement cela ne marche pas : il transforme fichiers ET répertoires

j'ai testé aussi sudo chmod 644 usr/share/locale/ *.mo -v -R, pas mieux

sudo chmod 644 usr/share/locale *.mo -v -R pas mieux.

Évidemment, l'option -R c'est change les permissions des fichiers ET des répertoires. mais comment ne changer que les fichiers ?

Dernière modification par Christophe C (Le 29/02/2020, à 13:40)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#2 Le 29/02/2020, à 13:42

Nuliel

Re : Modifier les droits d'1 type de fichier dans une arborescence

Salut,
Est ce que cette commande correspond à tes attentes?

find /usr/share/locale/ -name "*.mo" -exec chmod 644 {} \; 

Hors ligne

#3 Le 29/02/2020, à 13:55

Watael

Re : Modifier les droits d'1 type de fichier dans une arborescence

on peut ajouter un -type f pour ne viser que les fichiers.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 29/02/2020, à 19:54

Christophe C

Re : Modifier les droits d'1 type de fichier dans une arborescence

@watael : avec la commande find, je suppose, pas avec chmod ?

@Naziel : plutôt find /usr/share/locale/ -name "*.mo" -exec sudo chmod 644 {} \;

Merci, ç'est parfait smile. Par contre je comprends mal la commande. Je fais un find sur les "name" qui contiennent un *.mo., puis j'exécute une commande dont l'argument est le résultat du find. Ca, ok.
C'est la fin que je ne comprends pas : {} \;

Dernière modification par Christophe C (Le 29/02/2020, à 20:01)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#5 Le 29/02/2020, à 21:14

Nuliel

Re : Modifier les droits d'1 type de fichier dans une arborescence

find /usr/share/locale/ -name "*.mo" -exec sudo chmod 644 {} \;
find recherche
- dans le dossier /usr/share/locale/
- avec le nom qui se finit par .mo
- si on rajoute -type f on dit aussi qu'on ne cherche que dans les fichiers (et non les dossiers)
- exec exécute la commande sudo chmod 644 {} \;

{} correspond à l'occurence trouvée par find, donc pour chaque fichier trouvé par find correspondant aux critères précédents, {} correspond au chemin du fichier trouvé
\ permet d'échapper ; (sinon il serait interprété par le shell), et donc \; permet de marquer la fin de la commande passée à -exec (parce qu'on peut faire plusieurs commandes et donc plusieurs exec)

Dernière modification par Nuliel (Le 29/02/2020, à 21:15)

Hors ligne

#6 Le 01/03/2020, à 09:20

Christophe C

Re : Modifier les droits d'1 type de fichier dans une arborescence

J'ai compris que {} crée une espèce de boucle qui exécute pour tous les cas trouvés, par contre je sais faire un while et un read pour injecter dans la boucle, mais {}, cela semble plutôt abscons. D'habitude je l'utilise pour des fonctions

Par ailleurs, je ne comprends pas la notion de caractère d'échappement dans le cas d'espèce. J'utilise cela pour indiquer qu'un /n (par exemple) doit être compris comme un retour à la ligne et non comme une fonction à exécuter, mais là ça veut dire quoi ? Le shell interprète un point-virgule comme une fin de ligne, normalement. Comment l'interprète t'il avec un / ?
Ou alors ; est ici une partie intégrante de -exec ? la syntaxe est donc -exec commande ;
Et donc le caractère échappement est là pour que le point-virgule ne soit pas interprété comme une fin de ligne, mais comme une partie de -exec ?

Dernière modification par Christophe C (Le 01/03/2020, à 09:29)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#7 Le 01/03/2020, à 09:47

MicP

Re : Modifier les droits d'1 type de fichier dans une arborescence

Bonjour Christophe C

Fais attention à ne pas confondre le caractère / avec le caractère \

Toutes les réponses aux questions que tu poses dans ton dernier messages
sont dans la page man de la commande find

man find

Dernière modification par MicP (Le 01/03/2020, à 09:48)

Hors ligne

#8 Le 01/03/2020, à 11:01

moko138

Re : Modifier les droits d'1 type de fichier dans une arborescence

Entre ces deux variantes :

find /usr/share/locale -type f -name "*.mo" -exec sudo chmod 644 {} \; 
find /usr/share/locale -type f -name \*.mo -print0 | xargs -0 sudo chmod -v 644 

l'une d'elle vous paraît-elle préférable ? Si oui, pourquoi ?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#9 Le 01/03/2020, à 14:13

kamaris

Re : Modifier les droits d'1 type de fichier dans une arborescence

Je dirais que la seconde est préférable car elle fait un seul appel à sudo chmod.
Mais selon man find, la formulation suivante doit être à peu près équivalente, « sans sortir » de find :

find /usr/share/locale -type f -name "*.mo" -exec sudo chmod -v 644 {} +

Hors ligne

#10 Le 01/03/2020, à 22:46

melixgaro

Re : Modifier les droits d'1 type de fichier dans une arborescence

Salut,
Avec exec, ça ouvre autant de sous-shells que de résultats pour find ; avec xargs, un seul sous-shell est ouvert. C'est bien ce que tu veux dire kamaris ?
Si la commande à appliquer accepte plusieurs fichiers en arguments (c'est le cas de chmod qui accepte plusieurs fichiers en une fois), xargs est mieux de ce point de vue, en effet. Toutefois, si la liste de résultat est trop longue, xargs va râler.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#11 Le 01/03/2020, à 23:23

kamaris

Re : Modifier les droits d'1 type de fichier dans une arborescence

Oui, c'est ça.
Pour la liste d'arguments trop longue, je ne sais pas si c'est xargs qui va râler, ou le shell : le shell doit râler, mais peut-être xargs le fera-t-il en premier…
Je ne sais pas non plus si l'option « -exec {} + » de find s'arrange mieux de ça, ou pas.

Hors ligne

#12 Le 01/03/2020, à 23:35

melixgaro

Re : Modifier les droits d'1 type de fichier dans une arborescence

Oui, tu as raison, c'est le shell qui va râler. Merci d'avoir précisé mon propos wink
J'espérais que tu puisses en dire plus sur cette limitation dans le cadre de l'utilisation de la syntaxe « exec {} + ». Sûrement qu'il y aura le même problème.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#13 Le 02/03/2020, à 00:44

moko138

Re : Modifier les droits d'1 type de fichier dans une arborescence

Merci !
Je ne connaissais pas « {} + » :

       -exec commande {} +

Cette  variante  de l'option -exec exécute la commande spécifiée
sur le fichier sélectionné, mais en ajoutant le  nom  de  chaque
fichier trouvé à la fin de la ligne de commande. Le nombre total
d'invocation de la commande sera donc très inférieur  au  nombre
de  fichiers  trouvés.  La ligne de commande est construite à la
manière de xargs. Une seule instance de  « {} »  est  permise  à
l'intérieur  de  la  commande. La commande sera exécutée dans le
répertoire de départ.

   .
Et qu'entendez-vous par "le shell va râler" ?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#14 Le 02/03/2020, à 00:48

melixgaro

Re : Modifier les droits d'1 type de fichier dans une arborescence

Quand la ligne de commande contient trop d'arguments, bash (et sans doute d'autres shells) répondront « Argument list too long » (ou phrase équivalente dans la langue du système si c'est traduit).


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#15 Le 02/03/2020, à 02:04

kamaris

Re : Modifier les droits d'1 type de fichier dans une arborescence

Il semble que xargs gère automatiquement la limite pour la taille de la ligne de commande.
Je ne sais pas si ça a toujours été le cas, car j'ai vu nombre de posts ici ou là sur le web, dont les auteurs limitaient explicitement le nombre d'arguments par l'option -n, afin de ne pas avoir de problèmes.
En tout cas, en local, avec

$ xargs --version
xargs (GNU findutils) 4.7.0

j'ai

man xargs a écrit :

The  command  line  for  command  is built up until it reaches a system-defined limit (unless the -n and -L options are used).  The specified command will be invoked as many times as necessary to use up the list of input items.

Et en ligne, on trouve :

https://www.gnu.org/software/findutils/manual/html_mono/find.html a écrit :

xargs gives you control over how many arguments it passes to the command each time it executes it. By default, it uses up to ARG_MAX - 2k, or 128k, whichever is smaller, characters per command. It uses as many lines and arguments as fit within that limit.

J'ai donc tendance à croire que l'option « -exec {} + » de find doit elle aussi gérer ça automatiquement, au moins à partir d'une certaine version de find, même si je n'ai pas trouvé explicitement cette infomation.

Hors ligne

#16 Le 02/03/2020, à 02:43

moko138

Re : Modifier les droits d'1 type de fichier dans une arborescence

Merci les gars !  smile


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#17 Le 02/03/2020, à 09:22

Christophe C

Re : Modifier les droits d'1 type de fichier dans une arborescence

merci, c'est intéressant. Je ne connaissait pas -exec commande {} + ou -exec commande \;

Pour résumer, cela permet de faire un traitement en masse sur une sélection. Il y a d'autres utilisations ?

C'est spécifique à find, ou cela peut s'utiliser avec d'autres commandes (locate, ou autre ...) ?


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#18 Le 02/03/2020, à 10:44

rogn...

Re : Modifier les droits d'1 type de fichier dans une arborescence

Salut.
J'ai un problème avec ce -exec commande {} + , le man indique

If find encounters an error, this can sometimes cause an immediate exit, so some pend‐
              ing commands may not be run at all.  This variant of -exec always returns true.

Cela me plaît à moitié qu'une commande ait des résultats "probables" ou aléatoires, ou que ça retourne vrai tout le temps.

Autrement dit, il vaudrait mieux entourer vos {} ainsi : '{}' \; , non seulement ça ne fait pas de concaténation , mais en plus vous apportez une protection de plus  : celle qui prévient de l'interprétation comme un shell script. Ci-dessous ils font un -exec file '{}'\;

find . -type f -exec file '{}' \;

       Runs `file' on every file in or below the current directory.  Notice that the braces are enclosed in single quote marks to protect them  from
       interpretation  as shell script punctuation.  The semicolon is similarly protected by the use of a backslash, though single quotes could have
       been used in that case also.

#19 Le 02/03/2020, à 13:19

kamaris

Re : Modifier les droits d'1 type de fichier dans une arborescence

Christophe C a écrit :

C'est spécifique à find, ou cela peut s'utiliser avec d'autres commandes (locate, ou autre ...) ?

Oui, c'est spécifique à find.
Sauf exception d'une commande qui aurait aussi cette option, pour le cas général, il faut utiliser xargs.

rogn... a écrit :

Cela me plaît à moitié qu'une commande ait des résultats "probables" ou aléatoires, ou que ça retourne vrai tout le temps.

« exec {} + » ne renvoie vrai tout le temps qu'en interne, en tant qu'action dans find.
Mais si l'une des commandes lancées par « exec {} + » échoue, find sortira en erreur :

man find a écrit :

If any invocation with the `+' form returns a non-zero value as exit  status,  then  find  returns a non-zero exit status.

Par ailleurs, le fait que find puisse avoir ici des « résultats "probables" ou aléatoires » est inhérent à l'exécution groupée de commandes : si on emploie xargs et que xargs sort en erreur, on risque d'avoir le même problème.

rogn... a écrit :

Autrement dit, il vaudrait mieux entourer vos {} ainsi : '{}' \; , non seulement ça ne fait pas de concaténation , mais en plus vous apportez une protection de plus  : celle qui prévient de l'interprétation comme un shell script.

Outre que cela n'a rien à voir avec ce qui précède, c'est daté : très peu de shells nécessitent cette protection aujourd'hui, en tout cas pas bash, ni dash.
Voir par exemple https://unix.stackexchange.com/question … ells-which (qui pourtant date de 8 ans)
Il y a tout de même un cas où il faut faire attention, d'ailleurs mentionné dans le lien ci-dessus : lorsque les accolades figurent dans un mini-script, où leur contenu (non les accolades elles-mêmes) doit être protégé du découpage en mots par le shell.
Exemple :

$ ls
'nom de fichier avec des espaces'
$ find . -type f -exec bash -c 'ls {}' \;
ls: impossible d'accéder à './nom': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'de': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'fichier': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'avec': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'des': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'espaces': Aucun fichier ou dossier de ce type
$ find . -type f -exec bash -c 'ls "{}"' \;
'./nom de fichier avec des espaces'
$

Hors ligne

#20 Le 24/03/2020, à 18:30

kamaris

Re : Modifier les droits d'1 type de fichier dans une arborescence

kamaris a écrit :

Il semble que xargs gère automatiquement la limite pour la taille de la ligne de commande.
[…]
J'ai donc tendance à croire que l'option « -exec {} + » de find doit elle aussi gérer ça automatiquement, au moins à partir d'une certaine version de find, même si je n'ai pas trouvé explicitement cette infomation.

J'avais mal cherché :

https://www.gnu.org/software/findutils/manual/html_mono/find.html#Multiple-Files a écrit :

This expansion is done in such a way as to avoid exceeding the maximum command line length available on the system.

Hors ligne