Files
如果匹配特定組,我如何遞歸執行“chgrp”而不更改組?
我只是將主目錄中的所有文件/子目錄複製到另一個使用者的主目錄。
然後我
chown
對他的主目錄進行了遞歸,這樣他就成為了他所有文件/子目錄的所有者。我需要做的最後一件事是
chgrp
在他的主目錄上遞歸,這樣他的使用者名將是他所有文件/子目錄的組,而不是我的使用者名。問題是有幾個子目錄的組是“docker”。在這些子目錄中,有一些文件/目錄的組是我的使用者名,還有一些其他文件/目錄的組是“docker”。
我如何遞歸地
chgrp
在他的主目錄上執行,以便將組為我的使用者名的每個文件/子目錄都更改為他的使用者名,但組為“docker”的每個文件/子目錄都保持為“docker”?
用於
find
排除 group 擁有的任何東西docker
;從目標主目錄開始:find . ! -group docker -exec chgrp newgroup {} +
酌情更換
newgroup
。或者,查找您的團隊擁有的任何東西:
find . -group oldgroup -exec chgrp newgroup {} +
替換
oldgroup
和newgroup
酌情。
如何遞歸執行 (…) 以便 (…) 為 (…) 的每個文件/子目錄
對此的通用答案是
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(類似於
xargs
or tofind
’s-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:)