在所有文件夹上运行 chown 并将所有者设置为文件夹名称减去尾随的 / 的脚本

在所有文件夹上运行 chown 并将所有者设置为文件夹名称减去尾随的 / 的脚本

一些 numptychown -R username在我们的网络服务器上的 /home 文件夹中运行 . ,以为他位于所需的文件夹中。不用说,服务器正在抛出很多不稳定因素。

我们有 200 多个网站,我不想单独更改它们的所有者,因此我尝试编写一个脚本,将所有文件夹的所有者更改为文件夹名称,而不带尾随的 /。

这是我目前拥有的全部,一旦我可以删除 / 就没问题了,但我还想检查文件是否包含 .,如果不包含,则运行该命令,否则转到下一个。

#!/bin/bash
for f in *

do

    test=$f;
    #manipluate the test variable
    chown -R $test $f

done

任何帮助都将非常有帮助!

提前致谢!

答案1

假如说全部/home/ 目录中的文件夹代表用户名,可以使用:

for dir in /home/*/; do
    # strip trailing slash
    homedir="${dir%/}"
    # strip all chars up to and including the last slash
    username="${homedir##*/}"

    case $username in
    *.*) continue ;; # skip name with a dot in it
    esac

    chown -R "$username" "$dir"
done

我建议先运行一个测试循环,检查用户名是否真的与主目录匹配。

此 AWK 命令检索给定用户的主目录。

awk -F: -v user="$username" '{if($1 == user){print $6}}' < /etc/passwd

根据现有的主目录检查这个结果对于读者来说是一项练习。

答案2

您可以使用基名命令提供路径的最后一个部分

for dir in /home/*
do
    if [ -d "$dir" ]
    then
        username=$(basename "$dir")
        chown -R "$username" "$dir"
    fi
done

尽管我最初会将其运行为

for dir in /home/*
do
    if [ -d "$dir" ]
    then
        username=$(basename "$dir")
        echo "chown -R $username $dir"
    fi
done

以确保它是合理的。

相关内容