Files

如果匹配特定組,我如何遞歸執行“chgrp”而不更改組?

  • October 2, 2021

我只是將主目錄中的所有文件/子目錄複製到另一個使用者的主目錄。

然後我chown對他的主目錄進行了遞歸,這樣他就成為了他所有文件/子目錄的所有者。

我需要做的最後一件事是chgrp在他的主目錄上遞歸,這樣他的使用者名將是他所有文件/子目錄的組,而不是我的使用者名。

問題是有幾個子目錄的組是“docker”。在這些子目錄中,有一些文件/目錄的組是我的使用者名,還有一些其他文件/目錄的組是“docker”。

我如何遞歸地chgrp在他的主目錄上執行,以便將組為我的使用者名的每個文件/子目錄都更改為他的使用者名,但組為“docker”的每個文件/子目錄都保持為“docker”?

用於find排除 group 擁有的任何東西docker;從目標主目錄開始:

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

酌情更換newgroup

或者,查找您的團隊擁有的任何東西:

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

替換oldgroupnewgroup酌情。

如何遞歸執行 (…) 以便 (…) 為 (…) 的每個文件/子目錄

對此的通用答案是find或者zsh globs。使用其中之一來列舉您想要影響的文件,並且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 解決方案可能會遇到命令行長度限制,在這種情況下,您可以使用zargs(類似於xargsor to find’s -exec … {} +

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

chgrp 的內置 zsh 可載入

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

引用自:https://unix.stackexchange.com/questions/671142