45 votes

Comment puis-je chmoder/chowner une liste spécifique de fichiers ?

Je veux écrire un script .sh script pour configurer les permissions de certains dossiers, mais je me demandais si je pouvais exécuter quelque chose comme :

chown -644 ./one;/two;/three

pour chown une liste de dossiers, plutôt que d'appeler chown plusieurs fois.

Par ailleurs, serait-il possible de chown une liste de fichiers, et d'en exclure d'autres, comme par exemple :

chown -R -664 ./*;!./cache

J'espère que mes pseudo-lignes de commande ont un sens.

58voto

Dennis Points 46916

Presque tous les outils Unix acceptent une liste de fichiers comme arguments non optionnels. Comme d'habitude, les différents arguments doivent être séparés par des espaces :

chmod 644 one two three

Dans votre deuxième exemple, si vous utilisez Bash, un simple

chmod -R 644 !(cache)

suffira.

Cette approche nécessite une recherche étendue de motifs. Si elle est désactivée, vous pouvez l'activer avec la commande

shopt -s extglob

Voir : Manuel de référence de Bash # Correspondance de motifs

4voto

Sergey Beloglazov Points 111

Dresser une liste des noms de fichiers dans ./list-of-filenames-to-change.txt et de l'exécuter :

chmod g+w `cat list-of-filenames-to-change.txt`

ou utiliser la méthode décrite par d'autres ici :

chmod 644 one two three

ou utiliser la première option mais manipuler chaque ligne du fichier (dans cet exemple : remplacer " / " (AVEC espace avant) par " ./ ") :

chmod g+w `sed 's/ \// .\//' update-writable.txt`

3voto

gat1 Points 31

Si les fichiers que vous souhaitez modifier se trouvent dans un seul répertoire, vous pouvez les ls avec le modèle requis.

Par exemple, j'ai besoin que tous les fichiers .run téléchargés dans pwd soient transformés en exécutables :

chmod +x `ls *.run`

2voto

Dave Horner Points 243

Pour l'expression rationnelle gagner !

L'utilisation de find est le meilleur moyen auquel je puisse penser en dehors de l'utilisation de la regex qui peut déjà exister dans votre Shell particulier ou dans l'application que vous utilisez elle-même. J'ai d'abord essayé :

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Mais vous constaterez que le tuyau ne fonctionne pas dans ce cas. Une autre chose triste à apprendre... comme apprendre que chmod, chown, chgrp, et. al. ne supporte pas la sélection/exclusion multi-fichiers/regex elle-même...
La solution que j'ai trouvée :
https://stackoverflow.com/questions/19111067/regex-match-either-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

donc, pas vraiment de regex pour gagner, mais au moins nous avons un moyen d'injecter une liste de fichiers dans les args d'un programme en une seule ligne.

vous noterez qu'il faut échapper les métacaractères (), et l'ajout du paramètre -o pour chaque nom supplémentaire...

d'autres liens et contenus de ma part qui pourraient vous intéresser au cours de vos voyages :
Diverses informations - notes de korn bourne et de ses amis. - Site web de Dave Horner

Santé.
--dave

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X