Comment puis-je changer tous les fichiers appartenant à un utilisateur à un autre utilisateur?

39

Je recherche une commande Linux capable de changer la propriété de tous les fichiers appartenant à un utilisateur donné, de préférence dans un répertoire ciblé, en un autre utilisateur spécifié.

La commande de mes rêves ressemblerait à quelque chose comme ça ...

chuser -R --olduser tom --newuser jerry

ou

chuser -R --olduser 1066 --newuser 1492

C'est mon scénario ... J'ai un fichier de sauvegarde (.tgz) dans lequel sont conservées les informations relatives aux utilisateurs et aux groupes. Il a été pris à partir d'un serveur Web exécutant Apache et MySQL. Les fichiers de la sauvegarde proviennent de l'ensemble du système et contiennent des fichiers de plusieurs utilisateurs différents et de plusieurs comptes de type de système. Il est essentiel que les paramètres ne soient pas perdus lors de la restauration sur le nouveau serveur. Le problème est que les utilisateurs sur la machine sur lesquels les fichiers sont en cours de restauration ne correspondent pas à ceux du fichier de sauvegarde. Par exemple, les deux machines ont un utilisateur MySQL, mais elles ont des identifiants différents et il existe plusieurs identifiants sur les deux machines appartenant à des utilisateurs différents. Cela signifie qu'il n'y a aucun moyen de synchroniser les utilisateurs de la nouvelle machine avec ceux de l'ancienne machine.

Je peux trouver tous les fichiers utilisateurs avec la commande find comme ceci ...

find /decompressed-backup-dir -uid 1050

ou

find /decompressed-backup-dir -user tom

Si, comme je le soupçonne, il n'y a aucun moyen de faire ce que je veux avec une seule commande, alors peut-être y a-t-il un moyen de diriger les résultats de la commande find vers une autre commande afin de gérer le changement de propriété?

Je pourrais le faire avec un script PHP mais il y a 4 Go et des dizaines de milliers de fichiers dans la sauvegarde, donc je ne veux pas utiliser PHP ou Perl, mais je serais heureux avec un script shell capable de le gérer.

Hibou de nuit
la source

Réponses:

30

Quelque chose comme

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Ben Voigt
la source
1
au lieu de -uidje utilisé-user
alexandre1985
65

Je pense que la commande --from flag on chown est probablement le moyen le plus simple.

chown --from=oldguy newguy * -R
SiteKickr
la source
3
La meilleure solution, pas besoin de trouver l'amour
Tobias Hagenbeek le
2
Solution optimale
Karl Forner le
1
sur OS X, vous pouvez le faire avec brew install coreutilset gchown.
Jomo
C'est la réponse correcte et la meilleure.
George M
Je confirme, cela devrait être marqué comme la meilleure réponse.
Soullivaneuh
7

Ajout à la réponse par SiteKickr , chgrpn'a pas l' --fromargument, mais vous pouvez obtenir la même chose chownen omettant l'utilisateur.

Exemple:

chown -R --from=:currentgroup :newgroup /some/directory
TheBigB
la source
6

Vous pouvez utiliser find, comme quelqu'un l’a posté, pour faire le chown.

Cependant, vous n’avez peut-être pas à vous en taroccuper.

Par exemple, si vous faites un tarsur machine Aoù l' utilisateur tomest uid 500puis untarle fichier sur machine Blequel l' utilisateur tomest uid 505, tarallez faire la bonne chose et de faire les fichiers appartenant à uid 505.

Ciclamino
la source
Une information intéressante, je n'étais pas au courant. Donc, tar ne stocke pas seulement l'ID mais également le nom associé à l'uid.
Nicholi
3
Le format tar d'origine stockait uniquement les informations numériques. Le format UStar, introduit par POSIX à la fin des années 80, ajoute les noms. Donc, à peu près tout goudron que vous rencontrez ces jours-ci fait la bonne chose.
Ciclamino
1

La réponse définit à la fois l'utilisateur et le groupe:

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

mais si vous voulez changer SEULEMENT le groupe de fichiers qui appartient à un utilisateur, vous ne pouvez pas utiliser chown(autant que je sache), mais utilisez plutôt chgrp:

find /decompressed-backup-dir -uid 1050 -exec chgrp newgroup {} +

et pour changer SEULEMENT le groupe de fichiers qui appartient à un groupe que vous devez utiliser, par exemple:

find /decompressed-backup-dir -gid 400 -exec chgrp newgroup {} +

Juste pour ajouter des connaissances.

Timo Kähkönen
la source
1
En fait, vous pouvez simplement laisser de côté la newuserpartie. La page de manuel indique: "Si les deux points et le groupe sont indiqués, mais que le propriétaire est omis, seul le groupe des fichiers est modifié. Dans ce cas, il chownremplit la même fonction que chgrp."
Ben Voigt
0

Si vous devez mapper de manière récursive les anciens / nouveaux identifiants de propriété résolus sur le même /etc/passwdutilisateur ,

(ce qui pourrait arriver après que vous ayez introduit LDAP sur le serveur et que vous ayez /etc/passwddes entrées en double pour chaque utilisateur et groupe),

vous pouvez utiliser ce script, j'ai écrit: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Il crée lui-même le mappage. L'interface du programme est, malheureusement, dans le code. Ajoutez quelques instructions de débogage si vous devez rechercher comment il fait quoi. Mais c’est plutôt un chown glorifié avec une cartographie créée à partir de doublons de/etc/passwd . Si cela peut être utile à quiconque, ce serait vraiment cool. :)

galva
la source
-2

Vous pouvez utiliser chown - R /directory/file

Cette commande changera les permissions pour toutes les instances du répertoire chown - R /directory

Mansur
la source