모든 폴더에서 chown을 실행하고 소유자를 후행 /를 뺀 폴더 이름으로 설정하는 스크립트

모든 폴더에서 chown을 실행하고 소유자를 후행 /를 뺀 폴더 이름으로 설정하는 스크립트

일부 numty가 달렸습니다 chown -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

제정신인지 확인하기 위해.

관련 정보