Linux - Bash - 在许多用户目录中应用chown

时间:2014-10-14 19:26:07

标签: linux bash shell xargs 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,所以我只需要一种方法来清除./

有人有更好的解决方案吗?

3 个答案:

答案 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

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

只显示将要发生的事情(减去报价),而不执行任何操作。如果您满意,请将其从脚本中删除。