我刚刚将我的主目录中的所有文件/子目录复制到另一个用户的主目录中。
然后我对他的主目录进行了递归chown
,以便他成为所有文件/子目录的所有者。
我需要做的最后一件事是对他的主目录进行递归chgrp
,以便他的用户名将是他所有文件/子目录的组,而不是我的用户名。
问题是有几个子目录的组是“docker”。在这些子目录中,有一些文件/目录的组是我的用户名,还有一些文件/目录的组是“docker”。
我如何chgrp
在他的主目录上递归运行,以便将我的用户名所在组的每个文件/子目录更改为他的用户名,但组为“docker”的每个文件/子目录仍保留“docker”?
答案1
用于find
排除 group 拥有的任何内容docker
;从目标主目录开始:
find . ! -group docker -exec chgrp newgroup {} +
newgroup
酌情更换。
或者,查找您的团队拥有的任何内容:
find . -group oldgroup -exec chgrp newgroup {} +
更换oldgroup
并newgroup
视情况而定。
答案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 解决方案可能会遇到命令行长度限制,在这种情况下您可以使用扎格斯(类似于xargs
或find
的-exec … {} +
)
autoload zargs
zargs -- /home/new-user/some-files/**/*(g:pacoverflow:) -- chgrp new-user
zmodload -m -F zsh/files b:zf_\*
zf_chgrp new-user /home/new-user/some-files/**/*(g:pacoverflow:)