如果它与特定组匹配,如何递归运行“chgrp”而不更改组?

如果它与特定组匹配,如何递归运行“chgrp”而不更改组?

我刚刚将我的主目录中的所有文件/子目录复制到另一个用户的主目录中。

然后我对他的主目录进行了递归chown,以便他成为所有文件/子目录的所有者。

我需要做的最后一件事是对他的主目录进行递归chgrp,以便他的用户名将是他所有文件/子目录的组,而不是我的用户名。

问题是有几个子目录的组是“docker”。在这些子目录中,有一些文件/目录的组是我的用户名,还有一些文件/目录的组是“docker”。

我如何chgrp在他的主目录上递归运行,以便将我的用户名所在组的每个文件/子目录更改为他的用户名,但组为“docker”的每个文件/子目录仍保留“docker”?

答案1

用于find排除 group 拥有的任何内容docker;从目标主目录开始:

find . ! -group docker -exec chgrp newgroup {} +

newgroup酌情更换。

或者,查找您的团队拥有的任何内容:

find . -group oldgroup -exec chgrp newgroup {} +

更换oldgroupnewgroup视情况而定。

答案2

如何递归运行 (...) 以便每个 (...) 的文件/子目录是 (...)

对此的一般答案是find或者zsh 全局变量。使用其中之一来枚举您想要影响的文件,以及chgrp您已经知道对这些文件执行的操作(不是在递归模式下,因为 find 或 zsh 负责递归)。

find /home/new-user/some-files -group pacoverflow -exec chgrp new-user {} +

或者,如果您使用的是 zsh:

chgrp new-user /home/new-user/some-files/**/*(g:pacoverflow:)

zsh 解决方案可能会遇到命令行长度限制,在这种情况下您可以使用扎格斯(类似于xargsfind-exec … {} +

autoload zargs
zargs -- /home/new-user/some-files/**/*(g:pacoverflow:) -- chgrp new-user

或者zsh 可加载内置 chgrp

zmodload -m -F zsh/files b:zf_\*
zf_chgrp new-user /home/new-user/some-files/**/*(g:pacoverflow:)

相关内容