2011-03-22 16:29:12 +0000 2011-03-22 16:29:12 +0000
308
308

Comment puis-je faire fonctionner chown de manière récursive ?

J'ai un répertoire appelé pdfs qui contient un tas de sous-répertoires et de sous-sous-répertoires. Je veux changer la propriété de tous les fichiers PDF dans tous les sous-répertoires. Je viens d'essayer ceci :

chown -R someuser:somegroup *.pdf

…mais cela n'a pas changé la propriété des PDF dans les sous-répertoires. L'utilisateur et le groupe existent.

D'après la page de manuel de chown, le -R devrait signifier récursif :

-R, --recursive
          operate on files and directories recursively

Qu'est-ce que je manque ?

Réponses (7)

315
315
315
2011-03-22 16:47:32 +0000

Le mode récursif ne fonctionne que sur les répertoires, pas sur les fichiers. En utilisant le glob ‘*.pdf’, le shell passe la liste des fichiers à chown, qui voit que ce sont des fichiers, et change les permissions sur les fichiers qu'il voit, et c'est tout.

Rappelez-vous, dans les shells, le glob est évalué par le shell, pas par la commande. Si le glob correspond à des fichiers, ils sont passés à la commande et celle-ci ne sait jamais qu'un glob a existé. (Ceci est différent de la façon dont l'invite de commande de Windows faisait les choses). Si vous avez un répertoire, dont le contenu est quelque chose comme :

machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/

Et vous avez tapé :

chown -R someuser:somegroup *.pdf

Le shell ferait d'abord la liste : file1.pdf file2.pdf

et ensuite lancerait votre commande :

chown -R someuser:somegroup file1.pdf file2.pdf

Vous voyez, il n'y a pas de répertoire pour que -R agisse. Il fait ce que vous lui avez demandé - changer de propriétaire sur les deux fichiers de la ligne de commande, en ignorant ce drapeau -R bizarre.

Pour faire ce que vous voulez, utilisez le “*. pdf’ comme modèle pour ce répertoire et ses sous-répertoires, vous pouvez utiliser find, qui peut trouver des fichiers qui correspondent à un modèle de nom de fichier (ou à de nombreux autres critères) et les passer à une sous-commande

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

Cela commence dans le répertoire courant ‘.’ pour chercher des fichiers (type de fichier f) du modèle de nom '*.pdf' puis passe à xargs, qui construit une ligne de commande en chmod. Remarquez les guillemets autour du motif '*.pdf', rappelez-vous que le shell créera un glob si il le peut, mais vous voulez que le motif soit passé à find, vous devez donc le citer.

Comme les noms de fichiers peuvent contenir des espaces, vous voulez utiliser une astuce pour sécuriser le nom de fichier avec des espaces :

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

En bash 3 et plus bas, c'est la façon dont vous devez le faire. Un gobage plus puissant est disponible en bash 4 (avec shopt -s globstar)et d'autres coquilles. La même chose en zsh, en utilisant un glob récursif ** :

chown -R someuser:somegroup ./**/*.pdf
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Cela s'applique à tous les fichiers et à tous les sous-répertoires et sous-sous-répertoires du dossier spécifié. À utiliser avec précaution.

14
14
14
2011-03-22 16:37:41 +0000

Vous pouvez utiliser l'utilitaire find :

find . -name '*.pdf' -exec chown someuser:somegroup {} +

N'oubliez pas les citations autour de *.pdf. Sinon, le shell essaiera de l'étendre. Cela signifie que le shell remplacera déjà *.pdf par les noms de tous les fichiers PDF trouvés dans le répertoire courant. Mais ce n'est pas ce que vous voulez. Vous voulez trouver les fichiers PDF situés dans des sous-répertoires. A propos.. : C'est aussi le problème avec votre commande chown.

6
6
6
2011-03-22 16:38:07 +0000

La commande

chown -R someuser:somegroup *.pdf

ne fera que récurer les répertoires si le nom du répertoire se termine par .pdf. Vous avez besoin de quelque chose comme :

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
1
1
1
2016-05-11 01:38:58 +0000

pour changer la propriété d'un répertoire de manière récursive, utilisez simplement :

sudo chown -R <username>:<groupname> <dir name>

ici username = le nouvel utilisateur qui devrait être propriétaire du répertoire

groupname = le nouveau groupe qui devrait être propriétaire du répertoire

chaque fichier/répertoire a un utilisateur propriétaire et un groupe propriétaire

0
0
0
2018-01-25 13:36:51 +0000

J'utilise tree à la place :

sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}

Attention aussi à ne pas lancer de chown récursif ou de chmod sur le répertoire ‘/’ ou tout autre répertoire du système.

0
0
0
2019-01-29 20:22:33 +0000

Pour devenir propriétaire de tous les fichiers d'un répertoire, utilisez

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

au lieu de

sudo chown $USER directory\*

ou

sudo chown --recursive $USER directory

qui pourraient ne pas fonctionner s'il y a trop d'arguments produits par * (trop de fichiers dans le répertoire) ou qui ne font pas ce que vous voulez respectivement.