#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 . 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
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
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 :
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 !
%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
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.
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 :
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.
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
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é :
This expansion is done in such a way as to avoid exceeding the maximum command line length available on the system.
Hors ligne