Какой-то шаловливый побежал chown -R username
. в папке / home на нашем веб-сервере, думая, что он находится в нужной папке. Излишне говорить, что сервер выбрасывает много шатаний.
У нас более 200 веб-сайтов, и я не хочу отбирать их все по отдельности, поэтому я пытаюсь создать сценарий, который изменит владельца всех папок на имя папки без завершающего /.
Это все, что у меня есть, как только я удалю / все будет хорошо, но я также хотел бы проверить, содержит ли файл расширение. в нем, и если этого не произойдет, запустите команду, в противном случае перейдите к следующей.
#!/bin/bash
for f in *
do
test=$f;
#manipluate the test variable
chown -R $test $f
done
Любая помощь была бы замечательной!
Заранее спасибо!
При условии, что все папки в каталоге / 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
Сверка этого результата с существующим домашним каталогом - упражнение для читателя.
Вы можете использовать базовое имя команда для предоставления последнего компонента пути
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
чтобы убедиться, что это разумно.