我在/home/
目录上有大约400个用户。
我在/var/repos/my_repo.git
上有一个git存储库
我已经使用root帐户通过bash命令将这个存储库克隆到主文件夹上的所有用户。
现在,我想根据每个文件夹更改每个用户的克隆目录的所有者。
类似于:
find . -maxdepth 1 -type d ! -name . -prune -exec chown {}:MY_GROUP {}/www/my_repo.git -R
它将不起作用,因为{}返回./username
,所以我只需要一种方法来清理./
有人有更好的解决方案吗?
如果您没有正确地递归到子目录中,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' _ {} ;
分析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 " | xargs -I% echo chown -R "%:mygroup" "%/www/my_repo.git"
如果您的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 $@"
}
这只会显示将要发生的事情(减去引号),而不会执行任何操作。当你高兴的时候,把它从脚本中删除。