¿Cómo puedo cambiar todos los archivos que pertenecen a un usuario a otro usuario?

39

Estoy buscando un comando de Linux que pueda cambiar la propiedad de todos los archivos que pertenecen a un usuario determinado, preferiblemente en un directorio de destino, a otro usuario especificado.

El comando de mis sueños se vería así ...

chuser -R --olduser tom --newuser jerry

o

chuser -R --olduser 1066 --newuser 1492

Este es mi escenario ... Tengo un archivo de copia de seguridad (.tgz) con información de usuarios y grupos conservada. Fue tomado de un servidor web que ejecuta Apache y MySQL. Los archivos en la copia de seguridad provienen de todo el sistema y contienen archivos de varios usuarios diferentes y varias cuentas de tipo de sistema, y ​​es clave que cuando se restaure en el nuevo servidor, la configuración no se pierda. El problema es que los usuarios de la máquina en los que se restauran los archivos no coinciden con los del archivo de copia de seguridad. Por ejemplo, ambas máquinas tenían un usuario de MySQL pero tienen diferentes ID de usuario y existen varias ID de usuario que existían en ambas máquinas que pertenecen a diferentes usuarios. Esto significa que no hay forma de sincronizar los usuarios de la nueva máquina con los de la máquina anterior.

Puedo encontrar todos los archivos de los usuarios con el comando find como este ...

find /decompressed-backup-dir -uid 1050

o

find /decompressed-backup-dir -user tom

Si, como sospecho, no hay forma de hacer lo que quiero con un solo comando, ¿tal vez hay una manera de canalizar los resultados del comando find a otro comando para manejar el cambio de propiedad?

Podría hacer esto con un script PHP, pero hay 4GB y decenas de miles de archivos en la copia de seguridad, por lo que no quiero usar PHP o Perl, pero estaría contento con un script de shell que pudiera manejarlo.

Noctámbulo
fuente

Respuestas:

30

Algo como

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Ben Voigt
fuente
1
en lugar de lo -uidque solía usar-user
alexandre1985
65

Creo que la bandera --from en el comando chown es probablemente la forma más fácil.

chown --from=oldguy newguy * -R
SiteKickr
fuente
3
La mejor solución, no es necesario encontrar el amor
Tobias Hagenbeek
2
Solución óptima
Karl Forner
1
en OS X puedes hacer esto con brew install coreutilsy gchown.
jomo
Esta es la respuesta correcta y mejor.
George M
Confirmo que debería estar marcado como la mejor respuesta.
Soullivaneuh
7

Agregar a la respuesta de SiteKickr , chgrpno tiene el--from argumento, pero puede lograr lo mismo chownomitiendo el usuario.

Ejemplo:

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

Puedes usar find , como alguien más publicó, para hacer el chown.

Sin embargo, es posible que no tenga que tar que se encargará de las cosas por usted.

Por ejemplo, si realiza un tarencendido machine Adonde tomestá el usuario uid 500y luego untarel archivo enmachine B donde tomestá el usuario uid 505, tarhará lo correcto y hará que los archivos sean de su propiedad uid 505.

Ciclamino
fuente
Dato interesante, no estaba al tanto de esto. Entonces tar no solo almacena el uid sino también el nombre asociado con el uid.
Nicholi
3
El formato tar original solo almacenaba la información numérica. El formato UStar, introducido por POSIX a finales de los años 80, agrega los nombres. Así que casi cualquier alquitrán que encuentres en estos días hace lo correcto.
Ciclamino
1

La respuesta establece tanto el usuario como el grupo:

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

pero si desea cambiar SOLO un grupo de archivos que pertenece a algún usuario, no puede usar chown(hasta donde yo sé), sino que usa chgrp:

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

y para cambiar SOLO el grupo de archivos que pertenece a algún grupo que debe usar, por ejemplo:

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

Solo para agregar conocimiento.

Timo Kähkönen
fuente
1
En realidad, puedes dejar de lado la newuserparte. La página de manual dice: "Si se dan los dos puntos y el grupo, pero se omite el propietario, solo se cambia el grupo de archivos; en este caso, chownrealiza la misma función que chgrp".
Ben Voigt
0

Si necesita asignar de forma recursiva los ID de propiedad antiguos / nuevos que se resuelven en el mismo/etc/passwd usuario ,

(lo que podría suceder después de haber introducido LDAP en el servidor y /etc/passwdtener entradas duplicadas para cada usuario y grupo),

podrías usar este script que escribí: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Crea el mapeo por sí solo. La interfaz del programa está, desafortunadamente, en el código. Agregue algunas declaraciones de depuración si necesita investigar cómo hace qué. Pero es más o menos un vestido glorificado con un mapeo creado a partir de duplicados/etc/passwd . Si esto es útil para alguien, sería genial. :)

galva
fuente
-2

Puedes usar chown - R /directory/file

Este comando cambiará el permiso para todas las instancias del directorio chown - R /directory

Mansur
fuente