我在/home/
目录上有大约400个用户。
我在/var/repos/my_repo.git
我使用root帐户将此存储库通过bash命令克隆到主文件夹中的所有用户。
现在我想根据每个文件夹更改每个用户的克隆目录的所有者。
类似的东西:
find . -maxdepth 1 -type d ! -name . -prune -exec chown {}:MY_GROUP {}/www/my_repo.git -R
它无效,因为{}会返回./username
,所以我只需要一种方法来清除./
有人有更好的解决方案吗?
答案 0 :(得分:2)
如果您没有正确地递归到子目录中,find
只是一个不必要的复杂问题。
for d in */www/my_repo.git; do
chown -R "${d%%/*}:MY_GROUP "$d"
done
一个更优秀的方法可能是首先通过sudo
克隆为目标用户。
为了完整性,如果你真的想使用find
,那么稍微难看的修复可能是
find . -maxdepth 1 -type d ! -name . -prune -exec sh -c 'chown "${1#./}:MY_GROUP "$1"/www/my_repo.git -R' _ {} \;
答案 1 :(得分:2)
解析ls
的输出通常是非常糟糕的做法,但在这种情况下,你很可能不有任何带有空格的目录/home
,您可以安全地尝试以下
cd /home
ls | xargs -I% echo chown -R %:mygroup %/www/my_repo.git
尝试它,它处于 DRY 模式(只会回显chown
命令),如果满意则删除echo
。
当然,您也可以使用find
命令:
cd /home
find . -maxdepth 1 -type d -printf "%f\0" | xargs -I% echo chown -R "%:mygroup" "%/www/my_repo.git"
答案 2 :(得分:1)
如果您的chown
版本支持--reference
选项,则可以间接实现您想要的功能。在这种情况下,命令:
chown --reference=RFILE file_to_chown
其中RFILE
和file_to_chown
是两个文件(或目录),将更改file_to_chown
的所有者和组以匹配RFILE
的所有者和组。
由于您需要特殊群组,我们需要使用由用户拥有的辅助文件,并拥有群组MY_GROUP
。我们将mktemp
用于创建此类文件。
#!/bin/bash
shopt -s nullglob
rfile=$(mktemp) || { echo "oops"; exit 1; }
for i in /home/*/; do
[[ -d $i/www/my_repo.git ]] || continue
chown --reference="$i" "$rfile"
chown :MY_GROUP "$rfile" # or chgrp MY_GROUP "$rfile"
chown -R --reference="$rfile" "$i/www/my_repo.git"
done
此方法(使用--reference
)具有以下优点:用户的主页名称可能与用户名称不同。
没有临时文件的完全相同的方法,使用用户家中的my_repo.git
作为参考文件。
#!/bin/bash
shopt -s nullglob
for i in /home/*/; do
[[ -d $i/www/my_repo.git ]] || continue
chown --reference="$i" "$i/www/my_repo.git"
chown :MY_GROUP "$i/www/my_repo.git" # or chgrp MY_GROUP "$i/www/my_repo.git"
chown -R --reference="$i/www/my_repo.git" "$i/www/my_repo.git"
done
最后一点:如果你想在运行之前检查脚本的行为方式,你可以定义(在脚本内部,在for
循环之前)一个函数chown
:
chown() {
echo "chown $@"
}
只显示将要发生的事情(减去报价),而不执行任何操作。如果您满意,请将其从脚本中删除。