Come posso modificare tutti i file appartenenti a un utente in un altro utente?


39

Sto cercando un comando Linux che possa cambiare la proprietà di tutti i file appartenenti a un determinato utente, preferibilmente in una directory di destinazione, a un altro utente specificato.

Il comando dei miei sogni sarebbe simile a questo ...

chuser -R --olduser tom --newuser jerry

o

chuser -R --olduser 1066 --newuser 1492

Questo è il mio scenario ... Ho un file di backup (.tgz) con le informazioni dell'utente e del gruppo conservate in esso. È stato preso da un server Web che esegue Apache e MySQL. I file nel backup provengono da tutto il sistema e contengono file di diversi utenti diversi e diversi account di tipo di sistema ed è fondamentale che, quando ripristinati sul nuovo server, le impostazioni non vadano perse. Il problema è che gli utenti sulla macchina stanno ripristinando i file in modo che non corrispondano a quelli nel file di backup. Ad esempio, entrambe le macchine avevano un utente MySQL ma avevano ID utente diversi e c'erano diversi ID utente esistenti su entrambe le macchine appartenenti a utenti diversi. Ciò significa che non è possibile sincronizzare gli utenti sulla nuova macchina con quelli sulla vecchia macchina.

Posso trovare tutti i file degli utenti con il comando find in questo modo ...

find /decompressed-backup-dir -uid 1050

o

find /decompressed-backup-dir -user tom

Se, come sospetto, non c'è modo di fare ciò che voglio con un singolo comando, allora forse c'è un modo per convogliare i risultati del comando find a un altro comando per gestire il cambio di proprietà?

Potrei farlo con uno script PHP ma ci sono 4 GB e decine di migliaia di file nel backup, quindi non voglio usare PHP o Perl ma sarei felice con uno script shell che potrebbe gestirlo.

Risposte:


30

Qualcosa di simile a

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

1
invece di -uidme usato-user
alexandre1985,

65

Penso che il comando --from al comando chown sia probabilmente il modo più semplice.

chown --from=oldguy newguy * -R

3
La soluzione migliore, non c'è bisogno di trovarlo amore
Tobias Hagenbeek,

2
Soluzione ottimale
Karl Forner,

1
su OS X puoi farlo con brew install coreutilse gchown.
jomo,

Questa è la risposta corretta e migliore.
George M,

Confermo, dovrebbe essere contrassegnato come migliore risposta.
Soullivaneuh,

7

Aggiungendo alla risposta da SiteKickr , chgrpnon ha l' --fromargomento, ma è possibile ottenere lo stesso con chownomettendo l'utente.

Esempio:

chown -R --from=:currentgroup :newgroup /some/directory

6

Puoi usare find, come qualcun altro ha pubblicato, per fare il chown.

Tuttavia, potrebbe non essere necessario come tarprendersi cura delle cose per te.

Ad esempio, se crei un utente tarsu machine Adove si tomtrova uid 500e quindi untaril file su machine Bdove si tomtrova l' utente uid 505, tarfarà la cosa giusta e renderà i file di proprietà uid 505.


Bocconcino interessante, non ne ero a conoscenza. Quindi tar non solo memorizza l'UID ma anche il nome associato all'UID.
Nicholi,

3
Il formato tar originale memorizzava solo le informazioni numeriche. Il formato UStar, introdotto da POSIX alla fine degli anni '80, aggiunge i nomi. Quindi praticamente ogni catrame che incontri in questi giorni fa la cosa giusta.
Ciclamino,

1

La risposta imposta sia l'utente che il gruppo:

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

ma se vuoi cambiare SOLO gruppo di file che appartiene a qualche utente non puoi usare chown(per quanto ne so), ma invece usa chgrp:

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

e per cambiare SOLO il gruppo di file che appartiene ad un gruppo devi usare ad es .:

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

Solo per aggiungere conoscenza.


1
In realtà, puoi semplicemente lasciare fuori la newuserparte. La pagina man dice: "Se vengono indicati i due punti e il gruppo, ma il proprietario viene omesso, viene modificato solo il gruppo dei file; in questo caso, chownsvolge la stessa funzione di chgrp".
Ben Voigt,

0

Se devi mappare in modo ricorsivo gli ID proprietà vecchi / nuovi che si risolvono sullo stesso /etc/passwdutente ,

(che potrebbe accadere dopo aver introdotto LDAP nel server e /etc/passwdavere voci duplicate per ciascun utente e gruppo),

potresti usare questo script che ho scritto: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Crea il mapping da solo. Sfortunatamente l'interfaccia del programma è nel codice. Aggiungi alcune dichiarazioni di debug se devi indagare su come funziona. Ma è praticamente un abito glorificato con una mappatura creata da duplicati in/etc/passwd . Se questo fosse mai utile a qualcuno, sarebbe davvero bello. :)


-2

Puoi usare chown - R /directory/file

Questo comando cambierà l'autorizzazione per tutte le istanze della directory chown - R /directory

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.