web-dev-qa-db-fra.com

Comment puis-je chmod / chown une liste spécifique de fichiers?

Je veux écrire un script .sh pour configurer certaines autorisations de dossier, mais je me demandais si je pouvais exécuter quelque chose comme:

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

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

De même, y aurait-il un moyen de chowner 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.

26
josef.van.niekerk

Presque tous les outils Unix acceptent une liste de fichiers en tant qu'arguments sans option. Comme d'habitude, les différents arguments doivent être séparés par un espace:

chown 644 one two three

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

chown -R 644 !(cache)

sera suffisant.

Cette approche nécessite une correspondance de motif étendue. S'il est désactivé, vous pouvez l'activer avec

shopt -s extglob

Voir: Manuel de référence Bash # Pattern Matching

37
Dennis

Faites une liste des noms de fichiers dans mod-this.txt puis exécutez:

chmod g+w `cat mod-these.txt`

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

chown 644 one two three

ou allez en ville avec la première option mais manipulez chaque ligne du fichier (dans cet exemple: remplacez "/" (AVEC les espaces blancs avant) par "./"):

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

regex pour le gagner!

utiliser find est la meilleure façon de penser en dehors de l'utilisation de l'expression régulière qui existe peut-être déjà dans votre Shell ou dans l'application que vous utilisez vous-même. d'abord, j'ai 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 chmod, chown, chgrp, et. Al. ne prend pas en charge 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-string-stru-linux-find-command

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

donc, pas tellement regex pour la victoire, mais au moins nous avons un moyen d'injecter une liste de fichiers dans les arguments d'un programme dans une ligne.

vous remarquerez que vous devez échapper aux méta-caractères () et ajouter le paramètre -o pour chaque nom supplémentaire ...

autres liens et contenus de ma part susceptibles de vous intéresser tout au long de vos voyages:
Divers petits détails - des notes de Korn Bourne et de ses amis. - Site Web de Dave Horner

À votre santé.
- dave

2
Dave Horner

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

par exemple. J'ai besoin que tous les fichiers .run téléchargés dans pwd soient remplacés par un exécutable:

chmod +x `ls *.run`
2
gat1