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.Ceci s'appliquera à tous les fichiers et à tous les sous-répertoires et sous-sous-répertoires du dossier spécifié. Utilisez avec soin.
la source
sudo chown -R user ./
fonctionné pour moi, maissudo chown -R user ./*
ne l'a pas fait.env
.Vous pouvez utiliser l'
find
utilitaire:S'il vous plaît ne pas oublier les citations autour
*.pdf
. Sinon, le shell va essayer de le développer. Cela signifie que le shell remplacera déjà*.pdf
par les noms de tous les fichiers PDF présents dans le répertoire actuel. Mais ce n'est pas ce que tu veux. Vous souhaitez rechercher les fichiers PDF situés dans des sous-répertoires. Btw .: C'est aussi le problème avec votrechown
commande.la source
+
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 créée 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 quexargs
ses lignes de commande. Une seule instance de{}
est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.La commande
ne recurse que les répertoires vers le bas si le nom du répertoire se termine par .pdf. Vous avez besoin de quelque chose comme:
la source
pour changer la propriété d'un répertoire de manière récursive, utilisez simplement:
here nomutilisateur = le nouvel utilisateur qui devrait être propriétaire du répertoire
nom du groupe = le nouveau groupe qui devrait être propriétaire du répertoire
chaque fichier / répertoire a un propriétaire d'utilisateur et un propriétaire de groupe
la source
J'utilise à la
tree
place:Veillez également à ne pas exécuter récursif chown ou chmod sur le répertoire '/' ou un autre répertoire système.
la source
Pour devenir le propriétaire de tous les fichiers d’un répertoire, utilisez
au lieu de
ou
qui peut ne pas fonctionner s'il y a trop d'arguments produits par * (trop de fichiers dans le répertoire) ou qui ne font pas ce que vous voulez, respectivement.
la source