Je recherche une commande Linux capable de modifier 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’ya aucun moyen de faire ce que je veux avec une seule commande, alors peut-être qu’il existe un moyen de diriger les résultats de la commande find vers une autre commande pour 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 qui pourrait le gérer.
Quelque chose comme
find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Je pense que la commande --from flag on chown est probablement le moyen le plus simple.
chown --from=oldguy newguy * -R
Vous pouvez utiliser find
, comme quelqu'un l’a posté, pour faire chown
.
Cependant, vous n’aurez peut-être pas à le faire car tar
prendra soin de tout.
Par exemple, si vous faites un tar
sur machine A
où user tom
est uid 500
, puis untar
le fichier sur machine B
où user tom
est uid 505
, tar
fera ce qu'il faut et fera en sorte que les fichiers soient possédés par uid 505
.
En ajoutant à la réponse de SiteKickr , chgrp
n'a pas l'argument --from
, mais vous pouvez obtenir la même chose avec chown
en omettant l'utilisateur.
Exemple:
chown -R --from=:currentgroup :newgroup /some/directory
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
(pour 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.
Si vous avez besoin de mapper de manière récursive les anciens/nouveaux identifiants de propriété qui se résolvent vers le même utilisateur /etc/passwd
,
(ce qui pourrait arriver après que vous ayez introduit LDAP sur le serveur et que /etc/passwd
ait des 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 un mappage créé à partir de doublons dans /etc/passwd
. Si cela peut être utile à quiconque, ce serait vraiment cool. :)