许多用户目录中的Linux-Bash-apply chown



我在/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

其中RFILEfile_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 $@"
}

这只会显示将要发生的事情(减去引号),而不会执行任何操作。当你高兴的时候,把它从脚本中删除。

最新更新