Вы также можете попробовать установить восходящий пакет Debian libffi5, если для другого пакета требуется libffi5.
См. https://packages.debian.org/wheezy/libffi5 или соответствующий up! Debian для вашей версии Ubuntu.
Загрузите соответствующий пакет Debian (.deb) для вашей архитектуры и установите с помощью dpkg; например [F5]. Затем либо исправьте исходную установку (apt-get -f install), либо переустановите нужный пакет (apt-get install ...).
Предполагая, что www-данные являются правильной группой для вашего веб-сервера
Введите следующий код с вашим любимым редактором в chown_www.sh
#!/bin/bash
for directory in `find /var/www/html/ -mindepth 1 -maxdepth 1 -type d`
do
user=$(basename $directory)
chown -R $user:www-data $directory
done
делают его исполняемым
chmod +x /path/to/script/chown_www.sh
и выполняются как root или через sudo
sudo /path/to/script/chown_www.sh
Предполагая, что www-данные являются правильной группой для вашего веб-сервера [ ! d2]
В find с глубиной min / max 1 будут найдены только директории, расположенные непосредственно под /var/www/html -
-type d в случае, если в /html есть некоторые файлы.
Затем мы получаем имя каталога с помощью basename и делаем рекурсивный chown, как вы хотели.
Отказ от ответственности: это вдохновлено пользователем muclux, но мое редактирование было отклонено
Как насчет find?
find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;
Это будет просто найти все d -элементы под /var/www/html/, а не ниже ниже, и exec ute chown -R на каждом из них , Внутри оболочки bash $0 находится путь, обработанный в текущий каталог, а ${0##*/} - имя каталога выреза. Я добавил echo выше, чтобы он распечатывал каждую команду chown, которую он будет выполнять первым, если вы довольны результатами, просто запустите его без echo.
Если для любая причина, по которой вы хотите или нуждаетесь в другом подходе к задаче, - это некоторые альтернативы (все с echo для тестирования!), parallel один из них наиболее эффективен в случае огромного количества каталогов:
[F2]Я не знаю, хороший ли ваш план, но следующий скрипт мог выполнить эту работу (с помощью sudo). Обратите внимание, что вы можете использовать только существующие пользовательские идентификаторы в качестве владельцев.
#!/bin/bash
cd /var/www
for file in `find html/*`
do
d=`dirname $file`
p=`basename $d`
chown $p:www-data $file
done
Сценарий обрабатывает файлы и подкаталоги, поэтому нет необходимости в рекурсии.
basename (dirname (файл )) дает вам имя непосредственного «родительского» каталога.
Я предполагаю, что у вас есть N каталогов ниже /var/www/html и вы хотите изменить владельца этих каталогов верхнего уровня (рекурсивно), т. е.
/var/www/html/domain1 # -> change owner to "domain1" for this dir and below
/var/www/html/domain2 # -> change owner to "domain2" for this dir and below
/var/www/html/domain3 # -> change owner to "domain3" for this dir and below
Если, например, /var/www/html/domain1 имеет подкаталоги (например, public, css, data), тогда они не должны принадлежать пользователю public и т. д., но также и пользователю domain1.
это предварительное условие будет работать следующий скриптлет (как пользователь root):
#!/usr/bin/env bash
cd /var/www/html
GLOBIGNORE=. # to catch hidden directories
for dir in *; do
test -d $dir && chown -R $dir $dir;
done
Как насчет find?
find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;
Это будет просто найти все d -элементы под /var/www/html/, а не ниже ниже, и exec ute chown -R на каждом из них , Внутри оболочки bash $0 находится путь, обработанный в текущий каталог, а ${0##*/} - имя каталога выреза. Я добавил echo выше, чтобы он распечатывал каждую команду chown, которую он будет выполнять первым, если вы довольны результатами, просто запустите его без echo.
Если для любая причина, по которой вы хотите или нуждаетесь в другом подходе к задаче, - это некоторые альтернативы (все с echo для тестирования!), parallel один из них наиболее эффективен в случае огромного количества каталогов:
[F2]Как насчет find?
find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;
Это будет просто найти все d -элементы под /var/www/html/, а не ниже ниже, и exec ute chown -R на каждом из них , Внутри оболочки bash $0 находится путь, обработанный в текущий каталог, а ${0##*/} - имя каталога выреза. Я добавил echo выше, чтобы он распечатывал каждую команду chown, которую он будет выполнять первым, если вы довольны результатами, просто запустите его без echo.
Если для любая причина, по которой вы хотите или нуждаетесь в другом подходе к задаче, - это некоторые альтернативы (все с echo для тестирования!), parallel один из них наиболее эффективен в случае огромного количества каталогов:
[F2]