web-dev-qa-db-ja.com

すべてのフォルダーで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

どんな助けでも素晴らしいです!

前もって感謝します!

4
Shikoki

/ home /ディレクトリー内のallフォルダーがユーザー名を表すと想定すると、以下を使用できます。

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

この結果を既存のホームディレクトリと照合することは、読者の課題です。

6
Lekensteyn

basename コマンドを使用して、パスの最後のコンポーネントを指定できます

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

それが正気だったことを確認します。

1
user9517