Comment puis-je faire travailler Chown de façon récursive?

J'ai un répertoire appelé pdfs qui contient un ensemble de sous-sous-sous-répertoires. Je souhaite changer de propriété sur tous les fichiers PDF dans tous les sous-dossiers. Je l'ai simplement essayé:

 chown -R someuser:somegroup *.pdf 

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

Selon la page man pour chown , le -R devrait signifier récursif:

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

Qu'est-ce qui me manque?

    Le mode récursif fonctionne uniquement sur les répertoires, pas sur les fichiers. En utilisant le fichier '* .pdf' ', le shell passe la liste des fichiers à chown, qui voit ces fichiers et modifie les autorisations sur les fichiers qu'ils voient, et c'est tout.

    Rappelez-vous, dans les shells, le glob est évalué par le shell et non par la commande. Si le glob correspond aux fichiers, ils sont passés à la commande et la commande ne connaît jamais un glob existait. (Ceci est différent de la façon dont l'invite de la commande Windows utilisé pour faire les choses). Si vous avez un dir, avec le contenu comme:

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

    Et vous avez tapé:

     chown -R someuser:somegroup *.pdf 

    Le shell créerait d'abord la liste: file1.pdf file2.pdf

    Puis exécutez votre commande:

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

    Voir, il n'y a pas de répertoire pour -R pour agir. Il fait ce que vous l'avez demandé – modifiez la propriété sur les deux fichiers sur la ligne de commande, en ignorant ce scénario -R drapeau.

    Pour faire ce que vous voulez, utilisez le '* .pdf' comme modèle pour ce répertoire et les sous-répertoires, vous pouvez utiliser la find , qui peut trouver des fichiers qui correspondent à un motif de nom de fichier (ou beaucoup d'autres criterea) et passer à une sous-commande

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

    Cela commence dans le répertoire actuel '.' Pour rechercher des fichiers (type de fichier f) du modèle de nom '*.pdf' puis passe à xargs, qui construit une ligne de commande à chmod. Notez les citations autour du motif '*.pdf' , rappelez-vous que le shell créera un glob s'il le peut, mais vous voulez que le motif passé à find , donc vous devez le citer.

    Parce que les noms de fichiers peuvent avoir des espaces dans eux, vous souhaitez utiliser un truc pour le rendre filename-avec-espaces sûrs:

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

    En bash 3 et en bas, c'est la façon dont vous devez le faire. Des globbing plus puissants sont disponibles dans bash 4 (avec shopt -s globstar ) et d'autres shells. Le même dans zsh, en utilisant un récursif glob ** :

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

    Vous pouvez utiliser l'utilitaire de find :

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

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

    C'est pas compliqué.

     chown -R someuser:somegroup /your/folder/here/* 

    Cela s'appliquera chown à tous les fichiers et à tous les sous-répertoires et sous-sous-répertoires du dossier spécifié. Utilisez avec précaution.

    La commande

     chown -R someuser:somegroup *.pdf 

    Ne reculeront que 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 {} \; 

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

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

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

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

    Chaque fichier / répertoire possède un propriétaire d'utilisateur et un propriétaire de groupe