Question Comment puis-je faire travailler la tête de manière récursive?


J'ai un répertoire appelé pdfs qui contient un tas de sous-répertoires et sous-répertoires. Je souhaite changer de propriétaire sur tous les fichiers PDF de tous les sous-dossiers. Je viens d'essayer ceci:

chown -R someuser:somegroup *.pdf

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

Selon la page de manuel pour chown, la -R devrait signifier récursive:

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

Qu'est-ce que je rate?


226
2018-03-22 16:29


origine




Réponses:


Le mode récursif ne fonctionne que sur les répertoires, pas sur les fichiers. En utilisant le glob '* .pdf', le shell transmet la liste de fichiers à chown, qui voit qu'il s'agit de fichiers, et modifie les autorisations sur les fichiers qu'il voit, et c'est cela.

Rappelez-vous, dans les shells, le glob est évalué par le shell, pas la commande. Si le glob correspond à des fichiers, ils sont transmis à la commande et la commande ne sait jamais qu'un glob existait. (Ceci est différent de la manière dont l'invite de commande Windows utilisait les choses). Si vous avez un dir, 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: file1.pdf fichier2.pdf

puis lancez votre commande:

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

Voyez, il n'y a pas de répertoire sur lequel -R doit agir. Il fait ce que vous lui avez demandé - changer la propriété sur les deux fichiers sur la ligne de commande, en ignorant cet indicateur bizarre -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 passer à une sous-commande

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

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

Comme les noms de fichiers peuvent contenir des espaces, vous pouvez utiliser une astuce pour le rendre sûr avec le nom de fichier:

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

En bash 3 et plus bas, c'est comme ça que vous devez le faire. Plus puissant est disponible dans bash 4 (avec shopt -s globstar) et d’autres coquilles. Le même dans zsh, en utilisant un glob récursif **:

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

232
2018-03-22 16:47



Édité pour refléter ce bash 4 avec shopt -s globstar fait globuleuse récursive. - kojiro
@kojiro merci! comme vous pouvez le dire, j'utilise encore bash3 - Rich Homolka
Par la page de manuel affichée par l’affiche originale, j’ai trouvé que le chown -R avait bien changé de propriétaire sur les dossiers ET les fichiers. Pas besoin de trouver. Utiliser Mint 15. - gwideman
@gwideman Je sais que c'est vieux ... Mais oui, bien sûr -R fait récursive. L'OP a juste eu un problème avec un type très spécifique de récursivité, une extension et un "type de fichier est un fichier" filtré - Rich Homolka
@RichHomolka Ah. OP a déclaré que les fichiers se trouvaient dans un répertoire appelé «pdfs», alors j'ai supposé que le problème était de savoir comment spécifier pdfs comme répertoire à réincorporer, et que tous les fichiers contenus étaient des fichiers PDF. Mais vous avez peut-être raison si le travail consiste à sélectionner uniquement des fichiers PDF et à laisser les autres inchangés. - gwideman


C'est pas compliqué.

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

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


29
2017-11-09 11:44



Clairement, quelqu'un y répond depuis 4 ans, mais ty pour l'avertissement. - Francisco Tapia
Cette question est actuellement n ° 1 sur Google, il est donc important de noter la bonne réponse. - Sprachprofi
Bien sûr, celui accepté est plus élégant, lisible et complet - Francisco Tapia
En quelque sorte sudo chown -R user ./ travaillé pour moi, mais sudo chown -R user ./* n'a pas - Slav
Je sais que c'est vieux, mais si cela répond au titre, ne répond pas à la question. C'est en fait légèrement pire que ce que OP avait déjà essayé. - Rich Homolka


Vous pouvez utiliser le find utilitaire:

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

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 avec les noms de tous les fichiers PDF trouvés dans le répertoire en cours. Mais ce n'est pas ce que vous voulez. Vous souhaitez rechercher les fichiers PDF situés dans des sous-répertoires. Btw .: C'est aussi le problème avec votre chown commander.


14
2018-03-22 16:37



Je devais chercher le +, astuce 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'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite de la même façon que xargs construit ses lignes de commande. Une seule instance de {} est autorisé dans la commande. La commande est exécutée dans le répertoire de départ. - Patrick M
@PatrickM un autre avantage mineur à + vs; .... plus n'est pas un méta caractère shell et ne doit pas être échappé - Rich Homolka


La commande

chown -R someuser:somegroup *.pdf

ne recomposera que les répertoires si le annuaire le nom se termine par .pdf. Vous avez besoin de quelque chose comme:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

6
2018-03-22 16:38



Techniquement, cela ne va que vers le bas. que vous appeliez ou non cette récursivité est un exercice pour l'utilisateur :) - Rich Homolka


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

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

ici nom d'utilisateur = le nouvel utilisateur qui doit être propriétaire du répertoire

groupname = le nouveau groupe qui doit être propriétaire du répertoire

chaque fichier / répertoire a un propriétaire d'utilisateur et un propriétaire de groupe


0
2018-05-11 01:38



Cela ne fait pas ce que l'OP a demandé. Cela change la propriété de tout, OP a demandé un ensemble de fichiers spécifique. - Rich Homolka


j'utilise tree au lieu:

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}

Veillez également à ne pas exécuter chown ou chmod récursif dans le répertoire '/' ou un autre répertoire système.


0
2018-01-25 13:36