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

31

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

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

Existe-t-il également un moyen d'afficher 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 auront un sens.

josef.van.niekerk
la source

Réponses:

43

Presque tous les outils Unix acceptent une liste de fichiers comme 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 modèle étendue. S'il est désactivé, vous pouvez l'activer avec

shopt -s extglob

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

Dennis
la source
4

Faites une liste de noms de fichiers dans mod-these.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 un espace avant) par "./"):

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

regex pour la victoire!

l'utilisation de find est la meilleure façon de penser en dehors de l'utilisation de l'expression rationnelle 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 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:
/programming/19111067/regex-match-either-string-in-linux-find-command

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

donc, pas tellement de 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 seule ligne.

vous remarquerez que vous devez échapper aux méta-caractères (), et l'ajout du paramètre -o pour chaque nom supplémentaire ...

autres liens et contenus de moi qui pourraient vous intéresser tout au long de vos voyages:
divers morceaux - notes de korn bourne et amis. - Site Web de Dave Horner

À votre santé.
--dave

Dave Horner
la source
KISS win, Keep it simple and stupid! pas besoin de choses complexes qui peuvent être toujours propres et faciles.
Al-Mothafar
2

Si les fichiers que vous souhaitez modifier se trouvent dans un 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 changés en exécutables:

chmod +x `ls *.run`
gat1
la source