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