Скрипт для запуска chown для всех папок и установки владельца в виде имени папки без завершающего символа /

Скрипт для запуска chown для всех папок и установки владельца в виде имени папки без завершающего символа /

Какой-то numpty запустил chown -R username. в папке /home на нашем веб-сервере, думая, что он в нужной папке. Излишне говорить, что сервер выдает много wobbelys.

У нас более 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

чтобы убедиться, что это разумно.

Связанный контент