
Какой-то 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
чтобы убедиться, что это разумно.