386 votes

Comment faire pour que le chown fonctionne de manière récursive ?

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

chown -R someuser:somegroup *.pdf

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

Selon 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 rate ?

386voto

Lark Points 1640

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 que dans les shells, le glob est évalué par le Shell, et non par la commande. Si le glob correspond à des fichiers, ils sont transmis à la commande et la commande ne sait jamais qu'un glob existait. (C'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 tu as tapé :

chown -R someuser:somegroup *.pdf

Le Shell serait le premier sur la liste : fichier1.pdf fichier2.pdf

et ensuite exécuter votre commande :

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

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

Pour faire ce que vous voulez, pour utiliser le '*.pdf' comme modèle pour ce répertoire et ses sous-répertoires, vous pouvez utiliser find qui peut trouver des fichiers correspondant à 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 démarre dans le répertoire courant '.' pour rechercher les fichiers (type de fichier f) du modèle de nom '*.pdf' passe ensuite à xargs, qui construit une ligne de commande pour chmod. Remarquez les guillemets autour du motif '*.pdf' , rappelez-vous que le Shell créera un glob s'il le peut, mais que vous voulez que le modèle transmis à find Vous devez donc le citer.

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

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

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

chown -R someuser:somegroup ./**/*.pdf

1 votes

Modifié pour refléter que bash 4 avec shopt -s globstar fait du globbing récursif.

3 votes

D'après la page de manuel indiquée par le posteur d'origine, j'ai constaté que le chown -R a effectivement changé le propriétaire des dossiers ET des fichiers. Pas besoin de find. J'utilise Mint 15.

0 votes

@gwideman Je sais que c'est vieux... Mais oui, bien sûr, -R est récursif. L'OP avait juste un problème avec un type très spécifique de récursivité, une extension et un filtré "type de fichier est fichier".

87voto

Sprachprofi Points 921
chown -R someuser:somegroup /your/folder/here/*

Ceci appliquera chown à tous les fichiers et à tous les sous-répertoires et sous-sous-répertoires du dossier spécifié. A utiliser avec précaution.

2 votes

En quelque sorte sudo chown -R user ./ a fonctionné pour moi, mais sudo chown -R user ./* n'a pas

2 votes

Je sais que c'est vieux, mais même si cela répond au titre, cela ne répond pas à la question. C'est en fait légèrement pire que ce que le PO avait déjà essayé.

6 votes

@RichHomolka Ayant été amené ici juste à cause du titre de la question, je suis assez heureux de trouver cette réponse.

16voto

bmk Points 2015

Vous pouvez utiliser le find utilitaire :

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

N'oubliez pas les guillemets autour de *.pdf . Sinon, le Shell essaiera de le développer. Cela signifie déjà que le Shell va remplacer *.pdf avec les noms de tous les fichiers PDF trouvés dans le répertoire actuel. Mais ce n'est pas ce que vous voulez. Vous voulez trouver les fichiers PDF situés dans les sous-répertoires. Btw. : C'est aussi le problème avec votre chown commandement.

1 votes

J'ai dû chercher le + Un bon truc pour la performance. -exec command {} + Cette variante de l'action -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est construite en ajoutant chaque nom de fichier sélectionné à la fin ; le nombre total d'invocations de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite de la même manière que l'action xargs construit ses lignes de commande. Une seule instance de {} est autorisée au sein de la commande. La commande est exécutée dans le répertoire de départ.

0 votes

@PatrickM un (petit) autre avantage de + vs ; .... plus n'est pas un méta-caractère Shell et ne doit pas être échappé.

6voto

Tyler Griffiths Points 11

La commande

chown -R someuser:somegroup *.pdf

n'effectuera une récursion dans les répertoires que si l'option répertoire Le nom se termine par .pdf. Vous avez besoin de quelque chose comme :

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

0 votes

Techniquement, il n'ira qu'à un seul niveau vers le bas. Que vous appeliez cela une vraie récursion ou non est un exercice pour l'utilisateur :)

1voto

KawaiKx Points 1033

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 doit être propriétaire du répertoire

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

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

0 votes

Cela ne fait pas ce que le PO a demandé. Cela change la propriété de tout, le PO a demandé un ensemble spécifique de fichiers.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X