特定のグループと一致する場合、グループを変更せずに「chgrp」を繰り返し実行する方法は?

特定のグループと一致する場合、グループを変更せずに「chgrp」を繰り返し実行する方法は?

私のホームディレクトリのすべてのファイル/サブディレクトリを他のユーザーのホームディレクトリにコピーしました。

それから私は彼のホームディレクトリに再帰し、chown彼がすべてのファイル/サブディレクトリの所有者になるようにしました。

私が最後にやるべきことは、chgrp彼のユーザー名が私のユーザー名ではなく彼のすべてのファイル/サブディレクトリのグループになるように彼のホームディレクトリに再帰することです。

問題は、グループが「docker」のサブディレクトリが複数あることです。このサブディレクトリには、グループが私のユーザー名であるいくつかのファイル/ディレクトリと、グループが「docker」であるいくつかのファイル/ディレクトリがあります。

私のユーザー名が属するグループ内のすべてのファイル/サブディレクトリは彼のユーザー名に変更されますが、「docker」グループのすべてのファイル/サブディレクトリはまだ「docker」のままになるように、ホームディレクトリでこれを再帰的に実行するにはどうすればよいですか?chgrpしますか?

答え1

ターゲットホームディレクトリから始めて、findグループが所有するすべてのエントリを除外するために使用されます。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

またはzshは組み込みchgrpをロードできます。

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

関連情報