ディレクトリ、サブディレクトリ、およびファイルの所有権を変更するLinux bashスクリプト

ディレクトリ、サブディレクトリ、およびファイルの所有権を変更するLinux bashスクリプト

ファイルとディレクトリの所有権を変更するためのbashスクリプトを作成しました。

nfs 領域内のファイルとディレクトリの所有者を変更する必要があります。このゾーンでは、ファイルとディレクトリの所有権が特定のユーザーIDに属します。 (nfs ゾーンは、何らかの方法ですべてのディレクトリとファイルの所有者を対応するユーザー ID 番号に変更します.変更しました。これで、nfsゾーン内のすべてのディレクトリとファイルの所有権を新しいユーザーに変更する必要があります。

このスクリプトは、ある配列のディレクトリ/ファイル所有者(名前)と別の配列のディレクトリ/ファイルパスを取得します。配列を印刷すると、ファイル所有者名がファイルパスと一致することがわかります。。 forループよりもディレクトリ名とファイル所有者名が静的名(2100など)と同じ場合は、新しいユーザーのファイル所有権を変更します。問題は、スクリプトを実行すると、すべてのディレクトリとファイルの所有権を変更できないことです。ただそのうちの一部だけが変わるだけです。

スクリプトを実行する前の出力:

[root@eeprepo01 testscript]# ll
total 15
drwxr-xr-x 3 2100 3000    7 Nov 23 13:49 directory1
drwxr-xr-x 3 2400 3000    6 Nov 23 13:52 directory2
drwxr-xr-x 3 2300 3000    7 Nov 23 13:53 directory3
-rwxr-xr-x 1 root root 1016 Nov 23 14:01 modify.sh
-rwxr-xr-x 1 root root 1516 Nov 19 10:13 modifyzfs.sh
[root@eeprepo01 testscript]# cd directory1/
[root@eeprepo01 directory1]# ll
total 5
drwxr-xr-x 2 2100 5000 4 Nov 23 13:49 directory1_2
-rw-r--r-- 1 2100 3000 0 Nov 23 13:48 file1
-rw-r--r-- 1 2500 3000 0 Nov 23 13:48 file2
-rw-r--r-- 1 2300 3000 0 Nov 23 13:48 file3
-rw-r--r-- 1 2400 3000 0 Nov 23 13:48 file4
[root@eeprepo01 directory1]# cd directory1_2/
[root@eeprepo01 directory1_2]# ll
total 1
-rw-r--r-- 1 2100 5000 0 Nov 23 13:49 file1
-rw-r--r-- 1 2100 5000 0 Nov 23 13:49 file2
[root@eeprepo01 directory1_2]# 

ご覧のとおり、ファイルとディレクトリは実際のユーザーに対応する一部のIDであるいくつかの番号に属します。スクリプトを実行した後の出力は次のとおりです。

    [root@eeprepo01 testscript]# bash -x modify.sh 
    + path='/nfspath/testscripts/testscript/*'
    + path_owners=($(find $path -printf '%u\n'))
    ++ find /nfspath/testscripts/testscript/directory1 /nfspath/testscripts/testscript/directory2 /nfspath/testscripts/testscript/directory3 /nfspath/testscripts/testscript/modify.sh /nfspath/testscripts/testscript/modifyzfs.sh -printf '%u\n'
    + echo 2100 2400 root 2100 2100 2300 2500 2100 2400 2500 2300 2400 2500 2300 2600 2500 2300 2500 2600 2610 2710 2610 2710 2100 2710 2400 2300 root root
    2100 2400 root 2100 2100 2300 2500 2100 2400 2500 2300 2400 2500 2300 2600 2500 2300 2500 2600 2610 2710 2610 2710 2100 2710 2400 2300 root root
    + path_owners_names=($(find $path -print))
    ++ find /nfspath/testscripts/testscript/directory1 /nfspath/testscripts/testscript/directory2 /nfspath/testscripts/testscript/directory3 /nfspath/testscripts/testscript/modify.sh /nfspath/testscripts/testscript/modifyzfs.sh -print
    + echo /nfspath/testscripts/testscript/directory1 /nfspath/testscripts/testscript/directory1/file4 /nfspath/testscripts/testscript/directory1/directory1_2 /nfspath/testscripts/testscript/directory1/directory1_2/file1 /nfspath/testscripts/testscript/directory1/directory1_2/file2 /nfspath/testscripts/testscript/directory1/file3 /nfspath/testscripts/testscript/directory1/file2 /nfspath/testscripts/testscript/directory1/file1 /nfspath/testscripts/testscript/directory2 /nfspath/testscripts/testscript/directory2/file1 /nfspath/testscripts/testscript/directory2/file2 /nfspath/testscripts/testscript/directory2/file3 /nfspath/testscripts/testscript/directory2/directory2_2 /nfspath/testscripts/testscript/directory2/directory2_2/file3 /nfspath/testscripts/testscript/directory2/directory2_2/file2 /nfspath/testscripts/testscript/directory2/directory2_2/file1 /nfspath/testscripts/testscript/directory3 /nfspath/testscripts/testscript/directory3/file3 /nfspath/testscripts/testscript/directory3/file4 /nfspath/testscripts/testscript/directory3/directory3_1 /nfspath/testscripts/testscript/directory3/directory3_1/file2 /nfspath/testscripts/testscript/directory3/directory3_1/file1 /nfspath/testscripts/testscript/directory3/directory3_1/directory3_2 /nfspath/testscripts/testscript/directory3/directory3_1/directory3_2/file2 /nfspath/testscripts/testscript/directory3/directory3_1/directory3_2/file1 /nfspath/testscripts/testscript/directory3/file2 /nfspath/testscripts/testscript/directory3/file1 /nfspath/testscripts/testscript/modify.sh /nfspath/testscripts/testscript/modifyzfs.sh
    /nfspath/testscripts/testscript/directory1 /nfspath/testscripts/testscript/directory1/file4 /nfspath/testscripts/testscript/directory1/directory1_2 /nfspath/testscripts/testscript/directory1/directory1_2/file1 /nfspath/testscripts/testscript/directory1/directory1_2/file2 /nfspath/testscripts/testscript/directory1/file3 /nfspath/testscripts/testscript/directory1/file2 /nfspath/testscripts/testscript/directory1/file1 /nfspath/testscripts/testscript/directory2 /nfspath/testscripts/testscript/directory2/file1 /nfspath/testscripts/testscript/directory2/file2 /nfspath/testscripts/testscript/directory2/file3 /nfspath/testscripts/testscript/directory2/directory2_2 /nfspath/testscripts/testscript/directory2/directory2_2/file3 /nfspath/testscripts/testscript/directory2/directory2_2/file2 /nfspath/testscripts/testscript/directory2/directory2_2/file1 /nfspath/testscripts/testscript/directory3 /nfspath/testscripts/testscript/directory3/file3 /nfspath/testscripts/testscript/directory3/file4 /nfspath/testscripts/testscript/directory3/directory3_1 /nfspath/testscripts/testscript/directory3/directory3_1/file2 /nfspath/testscripts/testscript/directory3/directory3_1/file1 /nfspath/testscripts/testscript/directory3/directory3_1/directory3_2 /nfspath/testscripts/testscript/directory3/directory3_1/directory3_2/file2 /nfspath/testscripts/testscript/directory3/directory3_1/directory3_2/file1 /nfspath/testscripts/testscript/directory3/file2 /nfspath/testscripts/testscript/directory3/file1 /nfspath/testscripts/testscript/modify.sh /nfspath/testscripts/testscript/modifyzfs.sh
    + j=0
    + for i in '$path'
    + [[ 2100 -eq 2100 ]]
    ++ chown db1:5000 /nfspath/testscripts/testscript/directory1
    + j=1
    + for i in '$path'
    + [[ 2400 -eq 2100 ]]
    + [[ 2400 -eq 2600 ]]
    + [[ 2400 -eq 2500 ]]
    + [[ 2400 -eq 2300 ]]
    + [[ 2400 -eq 2610 ]]
    + [[ 2400 -eq 2710 ]]
    + [[ 2400 -eq 2400 ]]
    ++ chown db7:5000 /nfspath/testscripts/testscript/directory1/file4
    + j=2
    + for i in '$path'
    + [[ root -eq 2100 ]]
    + [[ root -eq 2600 ]]
    + [[ root -eq 2500 ]]
    + [[ root -eq 2300 ]]
    + [[ root -eq 2610 ]]

+ [[ root -eq 2710 ]]
+ [[ root -eq 2400 ]]
+ j=3
+ for i in '$path'
+ [[ 2100 -eq 2100 ]]
++ chown db1:5000 /nfspath/testscripts/testscript/directory1/directory1_2/file1
+ j=4
+ for i in '$path'
+ [[ 2100 -eq 2100 ]]
++ chown db1:5000 /nfspath/testscripts/testscript/directory1/directory1_2/file2
+ j=5
[root@eeprepo01 testscript]# 

配列がすべての値を取ることを示すために、配列をエコーし​​ました。また、bash -xを使用してスクリプトを実行しましたが、forループが6つの項目に対してのみ実行されることがわかりました。

スクリプトを実行した後、出力は次のようになります。

[root@eeprepo01 testscript]# ll
total 15
drwxr-xr-x 3 db1  5000    7 Nov 23 13:49 directory1
drwxr-xr-x 3 2400 3000    6 Nov 23 13:52 directory2
drwxr-xr-x 3 2300 3000    7 Nov 23 13:53 directory3
-rwxr-xr-x 1 root root 1016 Nov 23 14:01 modify.sh
-rwxr-xr-x 1 root root 1516 Nov 19 10:13 modifyzfs.sh
[root@eeprepo01 testscript]# cd directory1/
[root@eeprepo01 directory1]# ll
total 5
drwxr-xr-x 2 db1  5000 4 Nov 23 13:49 directory1_2
-rw-r--r-- 1 2100 3000 0 Nov 23 13:48 file1
-rw-r--r-- 1 2500 3000 0 Nov 23 13:48 file2
-rw-r--r-- 1 2300 3000 0 Nov 23 13:48 file3
-rw-r--r-- 1 db7  5000 0 Nov 23 13:48 file4
[root@eeprepo01 directory1]# cd directory1_2/
[root@eeprepo01 directory1_2]# ll
total 1
-rw-r--r-- 1 db1 5000 0 Nov 23 13:49 file1
-rw-r--r-- 1 db1 5000 0 Nov 23 13:49 file2
[root@eeprepo01 directory1_2]# cd ../../
[root@eeprepo01 testscript]# cd directory2/
[root@eeprepo01 directory2]# ll
total 5
drwxr-xr-x 2 2500 3000 5 Nov 23 13:52 directory2_2
-rw-r--r-- 1 2500 3000 0 Nov 23 13:50 file1
-rw-r--r-- 1 2300 3000 0 Nov 23 13:50 file2
-rw-r--r-- 1 2400 3000 0 Nov 23 13:50 file3

このスクリプトは、ディレクトリ1、ディレクトリ1_2、ファイル1と2の所有権のみを変更します。

スクリプトは次のとおりです。

#!/bin/bash

path="/nfspath/testscripts/*"

path_owners=($(find $path -printf '%u\n'))
echo ${path_owners[@]}
path_owners_names=($(find $path -print))
echo ${path_owners_names[@]}
j=0

for i in $path
do
    
        
    if [[ ${path_owners[$j]} -eq 2100 ]]; then
        `chown db1:5000 ${path_owners_names[$j]}`
        
    elif [[ ${path_owners[$j]} -eq 2600 ]]; then
        `chown db2:5000 ${path_owners_names[$j]}`
        
    elif [[ ${path_owners[$j]} -eq 2500 ]]; then
        `chown db3:5000${path_owners_names[$j]}`
        
    elif [[ ${path_owners[$j]} -eq 2300 ]]; then
        `chown db4:5000 ${path_owners_names[$j]}`
        
    elif [[ ${path_owners[$j]} -eq 2610 ]]; then
        `chown db5:5000 ${path_owners_names[$j]}`
    
    elif [[ ${path_owners[$j]} -eq 2710 ]]; then
        `chown db6:5000 ${path_owners_names[$j]}`
            
    elif [[ ${path_owners[$j]} -eq 2400 ]]; then
        `chown db7:5000 ${path_owners_names[$j]}`
        
    fi
    j=$((j+1))

done
 

ベストアンサー1

おすすめ記事