Comment chown / chmod tous les fichiers du répertoire courant?

56

J'essaie de modifier la propriété et les autorisations de certains fichiers (et répertoires) du répertoire actuel. J'ai essayé ceci:

chown username:groupname .

... s'attendre à ce que cela affecte tous les fichiers du répertoire actuel, mais uniquement le répertoire dans lequel je me trouve (ce qui est le contraire de ce que je veux faire). Je veux le changer sur tous les fichiers sans affecter le répertoire actuel dans lequel je me trouve.

Comment puis-je chown et chmod tous les fichiers du répertoire courant?

Andrew
la source
man chownet man chmodrépondez facilement à votre question.
Shi
2
@Shi Je pense que c'est une bonne question. La lecture de cette page de manuel n’aiderait pas. Globbing ne fait pas partie de chmod. Il est intégré à la coquille. Aussi, la lecture de la documentation sur Globbing vous aspire (j'ai passé beaucoup de temps à comprendre toutes les fonctionnalités de zsh).
djf
1
@djf:chown -R user:group .
Shi

Réponses:

96

Vous souhaitez utiliser chown username:groupname *et laisser le shell développer *le contenu du répertoire actuel. Cela modifiera les autorisations pour tous les fichiers / dossiers du répertoire actuel, mais pas le contenu des dossiers.

Vous pouvez également le faire chown -R username:groupname ., ce qui modifierait les autorisations sur le répertoire en cours, puis rétablira l'intérieur de celui-ci et tous les sous-dossiers pour modifier les autorisations.

chown -R username:groupname *modifiera les autorisations sur tous les fichiers et dossiers de manière récursive, tout en laissant le répertoire actuel lui-même. Ce style et le premier style sont ceux que je me trouve le plus souvent.

Darth Android
la source
2
@ Andrew Soyez sur vos gardes cependant, il peut être à la fois un ami et un ennemi des personnes fatiguées ou non préparées.
Darth Android
5
Aussi, méfiez-vous des dangers de l'époque. Comme il est placé juste à côté du tout-puissant "/" sur le clavier. Une simple faute de frappe peut facilement se transformer chown -R username:groupname .en chown -R username:groupname /. Faire une tâche de 2 secondes un cauchemar de 2 jours.
Teynon
@Tom C'est pourquoi je devrais probablement commencer à utiliser -vtoutes mes commandes récursives, mais trop paresseux
Kolob Canyon
Juste voté comme la meilleure et la plus concise des réponses, bien que je sois précis et que je nomme le répertoire, juste pour éviter un glissement du clavier:chown -R username:groupname directoryname
Dave Everitt
9

Je pense que tu veux ça:

chown username:groupname *

Si vous souhaitez également modifier de manière récursive les sous-répertoires, vous devez utiliser le commutateur -R( -robsolète):

chown -R username:groupname *

djf
la source
0

chownest super si vous êtes un superutilisateur. J'ai eu un problème où quelqu'un d'autre avait couru makedans mon répertoire, et possédais maintenant des fichiers que je ne pouvais pas modifier. Voici ma solution de contournement qui traite les fichiers et les répertoires, même si elle laisse les répertoires traîner avec un suffixe .mkmeownersi elle ne peut pas les supprimer.

  • Le script suivant modifie la propriété des fichiers et des répertoires qui lui sont transmis comme appartenant à l'utilisateur actuel, essayant de contourner les problèmes d'autorisations en créant une nouvelle copie de chaque répertoire ou fichier n'appartenant pas à l'utilisateur actuel, en supprimant (ou en tentant de supprimer) le fichier d'origine et renommer en conséquence.
  • L'intention est que ce soit une abréviation de "fais-moi propriétaire". Je n'utilise pas de trait de soulignement, car ils sont difficiles à taper.

Exemples:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • Le script suivant mkmeowneronedoit être sur votre chemin.

mkmeowner:

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1
sbcondor
la source
1
(1) Nous préférons les réponses qui incluent une explication. J'ai été pris par surprise lorsque j'ai lu vos scripts et que j'ai vu ce qu'ils ont fait, car votre paragraphe d'introduction ne me donnait pas la moindre idée. (2) Vous avez oublié de mentionner que l'utilisateur doit mettre mkmeowneronedans la recherche PATH.  mkmeownerva exploser si cela n'est pas fait. (3) Veuillez apprendre comment (c.-à-d. Quand et où) utiliser des guillemets dans des commandes shell et des scripts. Dire ${f}n'est pas une alternative utile; voir ça . … (Suite)
Scott
(Suite)… (4) Si vous exécutez votre script sur un répertoire, tous les fichiers de ce répertoire seront potentiellement copiés deux fois. (5)  exprest désuet. Il est plus efficace de faire une simple correspondance de chaîne dans le shell; bash prend également en charge la correspondance d'expression régulière. D'ailleurs, vous pourriez faire le test du nom de fichier dans find. (6). Votre expr matchcommande teste si ${f}se termine par mkmeowner, et non si elle se termine par .mkmeowner. Par conséquent, le script ne fonctionnera pas sur lui-même. … (Suite)
Scott
(Suite)… Maintenant, on peut soutenir que c'est une bonne chose: vous ne voulez pas déplacer ni potentiellement supprimer un script pendant son exécution. (Cela ne causera pas nécessairement de problème, mais cela peut être compliqué.) Mais vous devez comprendre (et documenter) des cas spéciaux comme celui-là. (7) Vous pouvez utiliser des traits de soulignement dans des chaînes de plusieurs mots.  dirorfileest difficile à lire et à comprendre (comparé à dir_or_file), et quand j'ai vu mkmeowner, ma première pensée était un chat ( mk +  meow +  ner).
Scott
Merci pour les notes Scott. 1. Je pensais avoir une explication mais permettez-moi d'être plus explicite. 2. bon point. J'avais capturé cela dans mon script original, mais j'avais retiré la référence. 3. J'écris des scripts shell depuis 30 ans, mais je vais essayer d'en apprendre plus. 4. Oui c'est le cas. À dessein, car si je ne possède pas le répertoire, je ne peux pas le supprimer. Je peux mentionner ça. 5. Yah je suis vieux jeu, mais expr fonctionne toujours assez bien 6. ha bon point. 7. Cependant, je pense que je pourrais obtenir une licence artistique, car les soulignés ne sont pas une règle. J'ai besoin d'un script qui fait miauler!
sbcondor
Je ne pense pas qu'il y ait un problème avec $ {f}, n'est-ce pas? C'est juste un peu plus long que nécessaire. C'est un format que j'utilise souvent parce que je peux utiliser une variable pour créer une chaîne plus longue telle que $ {f} .mkmeowner, et je n'ai pas à me rappeler si $ f.heck signifie $ {f} + diable ou $ { f.heck}
sbcondor