Le mode récursif ne fonctionne que sur les répertoires, pas les fichiers. En utilisant le glob '* .pdf', le shell passe la liste des fichiers à chown, qui voit que ce sont des fichiers, et modifie 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, pas par la commande. Si le glob correspond aux fichiers, ils sont passés à la commande et celle-ci ne sait jamais qu'un glob existe. (Cela diffère de la manière dont l'invite de commande Windows faisait auparavant). Si vous avez un répertoire, avec le contenu, 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: fichier1.pdf fichier2.pdf
puis lancez votre commande:
chown -R someuser:somegroup file1.pdf file2.pdf
Voir, il n'y a pas de répertoire pour -R sur lequel agir. Il fait ce que vous lui avez demandé - changer de propriétaire sur les deux fichiers de la ligne de commande, en ignorant cet indicateur bizarre -R.
Pour faire ce que vous voulez, utilisez le '* .pdf' comme motif pour ce répertoire et ces sous-répertoires, vous pouvez utiliser pour find
rechercher les fichiers qui correspondent à un motif de nom de fichier (ou de nombreux autres critères) et les transmettre à une sous-commande
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Cela commence dans le répertoire courant '.' pour rechercher des fichiers (type de fichier f) du modèle de nom '*.pdf'
puis passe à xargs, qui construit une ligne de commande pour chmod. Notez 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 motif soit transmis à find
, vous devez donc le citer.
Parce que les noms de fichiers peuvent contenir des espaces, vous voulez utiliser une astuce pour le rendre sûr avec le nom de fichier 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 coques. Le même en zsh, en utilisant un glob récursif **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
globbing récursif.