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