Como posso alterar todos os arquivos pertencentes a um usuário para outro usuário?


39

Estou procurando um comando Linux que possa alterar a propriedade de todos os arquivos pertencentes a um determinado usuário, de preferência em um diretório de destino, para outro usuário especificado.

Meu comando dos sonhos seria algo como isto ...

chuser -R --olduser tom --newuser jerry

ou

chuser -R --olduser 1066 --newuser 1492

Este é o meu cenário ... Eu tenho um arquivo de backup (.tgz) com informações de usuário e grupo preservadas. Foi retirado de um servidor da Web executando Apache e MySQL. Os arquivos no backup são de todo o sistema e contêm arquivos de vários usuários diferentes e várias contas do tipo sistema, e é importante que, quando restaurados no novo servidor, as configurações não sejam perdidas. O problema é que os usuários na máquina em que os arquivos estão sendo restaurados para não corresponder aos do arquivo de backup. Por exemplo, ambas as máquinas tinham um usuário MySQL, mas eles têm diferentes IDs de usuário e existem vários IDs de usuário existentes nas duas máquinas que pertencem a usuários diferentes. Isso significa que não há como sincronizar os usuários na nova máquina com os da máquina antiga.

Eu posso encontrar todos os arquivos de usuários com o comando find assim ...

find /decompressed-backup-dir -uid 1050

ou

find /decompressed-backup-dir -user tom

Se, como suspeito, não há como fazer o que quero com um único comando, talvez haja uma maneira de canalizar os resultados do comando find para outro comando para lidar com a mudança de propriedade?

Eu poderia fazer isso com um script PHP, mas existem 4 GB e dezenas de milhares de arquivos no backup, por isso não quero usar PHP ou Perl, mas ficaria feliz com um script de shell capaz de lidar com isso.

Respostas:



65

Eu acho que o comando --from flag on chown é provavelmente a maneira mais fácil.

chown --from=oldguy newguy * -R

3
Melhor solução, não há necessidade de encontrar amor
Tobias Hagenbeek

2
Solução ideal
Karl Forner

11
no OS X, você pode fazer isso com brew install coreutilse gchown.
Jomo

Esta é a resposta correta e melhor.
George M

Eu confirmo, deve ser marcado como a melhor resposta.
Soullivaneuh

7

Adicionando à resposta do SiteKickr , chgrpnão há --fromargumento, mas você pode conseguir o mesmo chownomitindo o usuário.

Exemplo:

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

6

Você pode usar find, como alguém postou, para fazer o chown.

No entanto, você pode não ter que tarcuidar das coisas para você.

Por exemplo, se você fizer um tarem machine Aonde o usuário tomestá uid 500e, em seguida, untaro arquivo no machine Bqual o usuário tomé uid 505, tarvai fazer a coisa certa e fazer os arquivos de propriedade de uid 505.


Boato interessante, eu não estava ciente disso. Portanto, o tar não apenas armazena o uid, mas também o nome associado ao uid.
Nicholi

3
O formato tar original armazenava apenas as informações numéricas. O formato UStar, introduzido pelo POSIX no final dos anos 80, adiciona os nomes. Então, praticamente qualquer alcatrão que você encontra atualmente faz a coisa certa.
Ciclamino 22/07

1

A resposta define usuário e grupo:

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

mas se você quiser alterar SOMENTE o grupo de arquivos que pertence a algum usuário, não poderá usar chown(até onde eu saiba), mas use chgrp:

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

e para alterar SOMENTE o grupo de arquivos que pertence a algum grupo, você deve usar, por exemplo:

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

Apenas para adicionar conhecimento.


11
Na verdade, você pode simplesmente deixar de fora a newuserparte. A página de manual diz: "Se os dois pontos e o grupo forem fornecidos, mas o proprietário for omitido, apenas o grupo dos arquivos será alterado; nesse caso, chowndesempenha a mesma função que chgrp."
Ben Voigt

0

Se você precisar mapear recursivamente os IDs de propriedade antigos / novos que são resolvidos para o mesmo /etc/passwdusuário ,

(o que pode acontecer depois que você introduz o LDAP no servidor e /etc/passwdtem entradas duplicadas para cada usuário e grupo),

você poderia usar este script que escrevi: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Ele cria o mapeamento por conta própria. A interface do programa está, infelizmente, no código. Adicione algumas instruções de depuração se precisar investigar como ele faz o quê. Mas é praticamente um chown glorificado com um mapeamento criado a partir de duplicatas/etc/passwd . Se isso for útil para alguém, seria muito legal. :)


-2

Você pode usar chown - R /directory/file

Este comando alterará a permissão para todas as instâncias do diretório chown - R /directory

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.