디렉터리, 하위 디렉터리 및 파일의 소유권을 변경하는 Linux bash 스크립트

디렉터리, 하위 디렉터리 및 파일의 소유권을 변경하는 Linux bash 스크립트

파일 및 디렉터리 소유권을 변경하기 위해 bash 스크립트를 작성했습니다.

nfs 영역 내의 파일 및 디렉터리 소유자를 변경해야 합니다. 이 영역에서는 파일 및 디렉터리 소유권이 특정 사용자 ID에 속합니다. (nfs 영역은 어떻게든 모든 디렉터리와 파일 소유자를 해당 사용자 ID 번호로 변경합니다. 예를 들어 file1 소유권은 2100에 속하고 2100은 사용자 db1에 속한 ID입니다.) 저희도 모르게 서버를 업그레이드하고 사용자 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
 

관련 정보