Рекурсивно изменить владельца каталога по имени этого каталога

Вы также можете попробовать установить восходящий пакет Debian libffi5, если для другого пакета требуется libffi5.

См. https://packages.debian.org/wheezy/libffi5 или соответствующий up! Debian для вашей версии Ubuntu.

Загрузите соответствующий пакет Debian (.deb) для вашей архитектуры и установите с помощью dpkg; например [F5]. Затем либо исправьте исходную установку (apt-get -f install), либо переустановите нужный пакет (apt-get install ...).

1
задан 18 January 2018 в 04:21

6 ответов

Рабочий скрипт

Предполагая, что 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, но мое редактирование было отклонено

4
ответ дан 22 May 2018 в 15:28
  • 1
    Я думаю, что for directory in */ намного проще и делает то же самое в экономном виде - представьте имена dir с пробелами или символами новой строки. – dessert 24 January 2018 в 02:53
  • 2
    chown не требуется имя группы, вы можете просто опустить его вместе с двоеточием. – dessert 24 January 2018 в 03:14
  • 3
    @dessert, я выбираю безопасный вариант с chown, так как, возможно, группа была некорректна раньше (root?). Что вы имеете в виду с for directory in */ - я не вижу преимущества, поскольку find намного быстрее, а белые пробелы или символы новой строки (или что-то еще) не сбегают в любом случае. Говоря о смешных именах каталогов, вся эта попытка не имеет никакой проверки ошибок - никакой перекрестной проверки, если dir-name совпадает с существующим пользователем и т. Д. ** ** НО ** мы мог использовать двойные кавычки на chown, которые помогли бы с пробелами и т. д., но я сомневаюсь, что имя пользователя с пробелами является жизнеспособным в любом случае ... – Robert Riedl 24 January 2018 в 15:55
  • 4
    На самом деле все, кроме / и NUL, разрешено. Я серьезно сомневаюсь, что вызов внешней программы, такой как find, происходит быстрее, чем bash pathname expansion . Ваша команда find также соответствует самому /var/www/html - я решил эту проблему с -mindepth 1, см. Мой ответ ниже. – dessert 24 January 2018 в 16:25
  • 5
    Да, конечно, но не совсем лучшая практика в именах пользователей . Вы можете протестировать скорость с time быстрее. -mindepth 1 - это не единственное, что мы можем добавить, так как это find, и не только bash мы можем использовать -type d в случае, если в /html ;-) есть бродячие файлы. --- на самом деле у меня был min / max глубина в исходном редактировании ответа muclux, но редактирование было отклонено – Robert Riedl 24 January 2018 в 16:44

Как насчет 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]
4
ответ дан 24 July 2018 в 13:23

Я не знаю, хороший ли ваш план, но следующий скрипт мог выполнить эту работу (с помощью 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 (файл )) дает вам имя непосредственного «родительского» каталога.

0
ответ дан 22 May 2018 в 15:28
  • 1
    Извините, но шляпа работает только в том случае, если нет дополнительных подкаталогов! Если usera имеет каталог, указанный root в его каталоге (т. Е. [F3]), все последующие файлы и каталоги будут принадлежать root! – Robert Riedl 21 January 2018 в 19:22
  • 2
    Извините, мое редактирование было отклонено, и мне было предложено опубликовать это как ответ. – Robert Riedl 22 January 2018 в 18:55

Я предполагаю, что у вас есть 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
0
ответ дан 22 May 2018 в 15:28
  • 1
    Используйте */ для соответствия только каталогам, таким образом вы можете сохранить test. – dessert 24 January 2018 в 02:55

Как насчет 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]
0
ответ дан 22 May 2018 в 15:28

Как насчет 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]
0
ответ дан 17 July 2018 в 22:46

Другие вопросы по тегам:

Похожие вопросы: