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?
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
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.
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
.
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 {} \;
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.
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
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.