web-dev-qa-db-fra.com

Comment puis-je faire fonctionner Chown récursivement?

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

chown -R someuser:somegroup *.pdf

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

Selon la page de manuel relative à chown, le -R devrait signifier récursif:

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

Qu'est-ce que je rate?

267
Nathan Long

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

N'oubliez pas 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 dans lequel -R puisse 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 -R original.

Pour faire ce que vous voulez, pour utiliser le '* .pdf' en tant que modèle pour ce répertoire et ses sous-répertoires, vous pouvez utiliser find, qui peut rechercher les fichiers qui correspondent à un modèle 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) de modèle de nom '*.pdf' puis passe à xargs, qui construit une ligne de commande pour chmod. Notez les guillemets autour du modèle '*.pdf', rappelez-vous que le shell créera un glob si possible, mais que vous voulez que le modèle 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. Des fonctions plus puissantes sont disponibles dans bash 4 (avec shopt -s globstar) et dans d’autres shells. La même chose en zsh, en utilisant un glob globulaire récursif **:

chown -R someuser:somegroup ./**/*.pdf
275
Rich Homolka
chown -R someuser:somegroup /your/folder/here/*

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

45
Sprachprofi

Vous pouvez utiliser l'utilitaire find:

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

N'oubliez pas les guillemets autour de *.pdf. Sinon, le shell tentera de l’étendre. Cela signifie déjà que le Shell remplacera *.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 voulez trouver les fichiers PDF situés dans des sous-répertoires. Btw .: C'est aussi le problème avec votre commande chown.

14
bmk

La commande

chown -R someuser:somegroup *.pdf

ne recurse que si le répertoire directory name se termine par .pdf. Vous avez besoin de quelque chose comme:

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

J'utilise plutôt tree:

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

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

0
Eduard Florinescu

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

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

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

0
KawaiKx

Pour devenir le propriétaire de tous les fichiers d’un répertoire, utilisez

find directory -type f -name '*' | Sudo xargs -d '\n' chown $USER

au lieu de

Sudo chown $USER directory\*

ou

Sudo chown --recursive $USER directory

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.

0
masterxilo