Comment chown un répertoire récursivement comprenant des fichiers cachés ou des répertoires


37

On dirait que chown avec l'indicateur récursif ne fonctionnera pas sur des répertoires ou des fichiers cachés. Y at-il une solution de contournement simple pour cela?

Réponses:


56

Je suis à peu près sûr que le -Rdrapeau fonctionne - il l'a toujours fait pour moi de toute façon. Ce qui ne fonctionnera pas, et ce qui m’a fait trébucher au début de mon utilisation de la ligne de commande, est d’utiliser *un répertoire contenant des fichiers / répertoires cachés. Faire

$ chown -R /home/user/*

ne fera pas les fichiers cachés et les répertoires. Cependant si vous le suivez avec

$ chown -R /home/user/.[^.]*

alors vous ferez tous les fichiers cachés (mais pas .ou ..comme vous le /home/user/.*feriez). Cela dit, je m'attendrais à

$ chown -R /home/user

pour obtenir tous les fichiers et répertoires cachés /home/user- bien que cela modifie bien sûr également les permissions du répertoire lui-même, ce qui peut ne pas être ce que vous vouliez.


3
Faire un chownsur le répertoire a pour effet secondaire que vous modifiez les autorisations sur le répertoire lui-même ainsi que tout son contenu, ce qui peut être ou ne pas être ce que vous voulez.
wfaulk

A + a travaillé comme un charme pour moi.
SuperFamousGuy

J'ai essayé chown nginx:nginx -R /path/to/.[^.]*et il a seulement changé de propriétaire en fichiers cachés .dot. pas tout.
Pathros

@wfaulk Comme l'a mentionné @Hamish Downer, vous devez faire les deux *et suivre .[.^]*pour obtenir tous les fichiers.
god_is_love

9

Je crois que la commande suivante devrait fonctionner pour cette

chown -hR userid:usergroup /nameofdirectory/nameofsubdir/

1
-h affecte les liens symboliques au lieu de tout fichier référencé (utile uniquement sur les systèmes pouvant changer la propriété d'un lien symbolique)
R. van Twisk

8

"chown -R" fonctionne, mais une alternative serait d'utiliser find.

 find /path/to/dir -exec chown USER {} \;

5
notez qu'avec GNU find, utiliser +au lieu de ;comme terminateur de -exec sera plus efficace car il utilisera le nombre minimum nécessaire de forks à chown au lieu d'un fork par fichier / répertoire
ragoût

3

Vous pouvez modifier l' dotglobattribut temporairement pour le développer. fichiers et ensuite le retourner.

shopt -s dotglob; chown -R user:group FOLDER; shopt -u dotglob

Plus sur dotglobpeut être trouvé ici


2

L' utilisation de la boucle avec ls -Aoption, nous pouvons trouver tous les fichiers cachés et le répertoire exclure .et ..puis modifiez la propriété pour tous les fichiers cachés et répertoire.

for i in `ls -A | grep "^\."`;do chown -R user:group $i;done

Utilisez l' xargsoption avecls -A

ls -A | grep "^\." | xargs chown user:group

Pour plus de détails, cliquez ici et visitez mon site


1

En outre, si vous êtes comme moi, vous exécuterez probablement chown principalement à partir du répertoire actuel. Je suis habitué à cette course comme: chown rails.rails -R *. Changer simplement l'astérisque en un point (abrégé pour le répertoire en cours) comme ceci: chown rails.rails -R .fait apparaître tous les répertoires cachés.


2
Avec l’effet secondaire que vous modifiez les autorisations sur le répertoire en cours ainsi que tout son contenu, ce qui peut être ou ne pas être ce que vous voulez.
wfaulk

1

chownfonctionnera avec les fichiers cachés et les répertoires. Dans l'exemple suivant, nous allons changer la propriété des utilisateurs et des groupes pour tous les fichiers de ~/some/folder. Tous les fichiers incluent tous les fichiers cachés (par exemple .bashrc, .profileetc.) et les dossiers au ~/some/folderniveau et au-dessous. Notez en particulier que nous ne souhaitons pas changer de propriétaire ~/some, nous exclurons donc le fichier ~/some/..des modifications de propriétaire.

$ cd ~/some/folder 
$ sudo chown -R usrname:grpname . 
$ 

Cela a fonctionné pour moi
klor

0

Pour chown TOUS les fichiers du répertoire et des sous-répertoires actuels de l’utilisateur actuel;

find . -exec chown $(whoami) {} \;

ou si l'utilisateur ne peut pas chown certains fichiers en raison d'autorisations restreintes;

sudo find . -exec chown $(logname) {} \;

-2

Vous pourriez faire quelque chose comme

for i in `ls -A`;do chown -R user:group $i;done

Le -A( capital A) est important car il exclut "." et '..'


Cela ne modifiera que les fichiers et les sous-répertoires du répertoire actuel, pas les niveaux inférieurs. (Ce qui peut être ce que l'OP veut.) Il va également casser les noms de fichiers et les noms de répertoires contenant des espaces (ou des onglets).
wfaulk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.