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

pac*_*low 6 directory recursive group files chgrp

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

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

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

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

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

Ste*_*itt 17

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

find . ! -group docker -exec chgrp newgroup {} +
Run Code Online (Sandbox Code Playgroud)

newgroup酌情更换。

或者,查找您的团体拥有的任何东西:

find . -group oldgroup -exec chgrp newgroup {} +
Run Code Online (Sandbox Code Playgroud)

更换oldgroupnewgroup视情况而定。

  • +1 就我个人而言,我更喜欢替代方案。指定您要搜索的确切组并将其替换为其他组。 (6认同)

Gil*_*il' 6

\n

如何递归运行 (\xe2\x80\xa6) 以便 (\xe2\x80\xa6) 为 (\xe2\x80\xa6) 的每个文件/子目录

\n
\n

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

\n
find /home/new-user/some-files -group pacoverflow -exec chgrp new-user {} +\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
chgrp new-user /home/new-user/some-files/**/*(g:pacoverflow:)\n
Run Code Online (Sandbox Code Playgroud)\n

zsh 解决方案可能会遇到命令行长度限制,在这种情况下您可以使用zargs(类似于xargsfind\'s -exec \xe2\x80\xa6 {} +

\n
autoload zargs\nzargs -- /home/new-user/some-files/**/*(g:pacoverflow:) -- chgrp new-user\n
Run Code Online (Sandbox Code Playgroud)\n

或者chgrp 的 zsh 可加载内置

\n
zmodload -m -F zsh/files b:zf_\\*\nzf_chgrp new-user /home/new-user/some-files/**/*(g:pacoverflow:)\n
Run Code Online (Sandbox Code Playgroud)\n