すべてのフォルダに対して chown を実行し、末尾の / を除いたフォルダ名を所有者として設定するスクリプト

すべてのフォルダに対して chown を実行し、末尾の / を除いたフォルダ名を所有者として設定するスクリプト

ある愚か者がchown -R username、目的のフォルダにいると思い込んで、Web サーバーの /home フォルダで . を実行しました。言うまでもなく、サーバーは多くの問題を引き起こしています。

当社には 200 を超える Web サイトがあり、それらすべてを個別に chown したくないので、末尾の / を除いたフォルダー名にすべてのフォルダーの所有者を変更するスクリプトを作成しようとしています。

今のところはこれですべてです。/ を削除できれば問題ありませんが、ファイルに . が含まれているかどうかも確認し、含まれていない場合はコマンドを実行し、含まれている場合は次のコマンドに進みます。

#!/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

それが正気であることを確認するためです。

関連情報