如何将属于一个用户的所有文件更改为另一个用户?

Nig*_*Owl 58 linux shell command-line

我正在寻找一个 Linux 命令,该命令可以将属于给定用户的所有文件的所有权(最好在目标目录中)更改为另一个指定用户。

我梦想中的命令看起来像这样......

chuser -R --olduser tom --newuser jerry
Run Code Online (Sandbox Code Playgroud)

或者

chuser -R --olduser 1066 --newuser 1492
Run Code Online (Sandbox Code Playgroud)

这是我的场景...我有一个备份文件 (.tgz),其中保存了用户和组信息。它取自运行 Apache 和 MySQL 的 Web 服务器。备份中的文件来自整个系统,包含来自多个不同用户和多个系统类型帐户的文件,关键是在新服务器上恢复时,设置不会丢失。问题是正在恢复文件的机器上的用户与备份文件中的用户不匹配。例如,两台机器都有一个 MySQL 用户,但它们有不同的用户 ID,并且两台机器上存在多个属于不同用户的用户 ID。这意味着无法将新机器上的用户同步到旧机器上的用户。

我可以使用 find 命令找到所有用户文件,如下所示...

find /decompressed-backup-dir -uid 1050
Run Code Online (Sandbox Code Playgroud)

或者

find /decompressed-backup-dir -user tom
Run Code Online (Sandbox Code Playgroud)

如果,正如我怀疑的那样,没有办法用单个命令做我想做的事,那么也许有一种方法可以将 find 命令的结果通过管道传输到另一个命令来处理所有权更改?

我可以用 PHP 脚本来做到这一点,但备份中有 4GB 和数万个文件,所以我不想使用 PHP 或 Perl,但我会对可以处理它的 shell 脚本感到满意。

小智 86

我认为 chown 命令上的 --from 标志可能是最简单的方法。

chown --from=oldguy newguy * -R
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于所有者:组。chown -R --from=oldowner:oldgroup newowner:newgroup (4认同)
  • 最佳解决方案,无需寻找爱情吧 (3认同)
  • 最优解 (2认同)
  • 在 OS X 上,你可以使用 `brew install coreutils` 和 `gchown` 来做到这一点。 (2认同)

Ben*_*igt 38

就像是

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Run Code Online (Sandbox Code Playgroud)

  • 我使用了 `-user` 而不是 `-uid` (4认同)

小智 13

添加到SiteKickr答案中chgrp没有--from参数,但您可以chown通过省略用户来实现相同的目的。

例子:

chown -R --from=:currentgroup :newgroup /some/directory
Run Code Online (Sandbox Code Playgroud)


Cic*_*ino 6

您可以find像其他人发布的那样使用来执行chown.

但是,您可能不必tar为您处理事情。

例如,如果你犯了一个tarmachine A这里的用户tomuid 500untar上的文件machine B,其中用户tomuid 505tar会做正确的事,让所拥有的文件uid 505

  • 原始的 tar 格式只存储数字信息。POSIX 在 80 年代后期引入的 UStar 格式添加了名称。所以几乎你现在遇到的任何焦油都会做正确的事情。 (3认同)