@ruboss

Chown и chmod для большого количества файлов?

Всем привет, на сервере стоит апач и куча папок с root правами ~ 1 200 000 папок и в каждой по 1 файлу. Все находится на Amazon aws, linux ubuntu. Поскольку сам диск 22Гб, то количество хранимых файлов на единицу памяти было увеличено. Файловоя система ext4, inode_ratio = 4096 , что дает возможность на 22ГБ хранить ~ 6 000 000 инодов.

Задача: нужно всем 2 400 000 файлам дать chown www-data.www-data и chmod 0755

Я делаю: sudo chown www-data.www-data -R dir/
в итоге проходит минут 15 и удается установить владельца только для 600 000 файлов, а дальше не идет

Копал в инете, нашел некий xargs -p и find. Не могу их скомпоновать, подскажите кто знает как установить chown только для тех файлов кто сейчас под root и так же chmod 0755 для тех файлов, которые не имеют его

Что-то вроде этого (не используйте этот пример, он не верный)
find -юзер root dir/ | xargs -p chown www-data.www-data -R dir/
find -права -rw-r--r-- dir/ | xargs -p chmod 0755 -R dir/


UPDATE:
важная деталь - все папки пронумерованы от 1 до 1 200 000 и имеют следующую структуру 1/file.txt

ОТВЕТ
Спасибо за помощь Aves и fomistoklus!!!
Для этой задачи не смог найти решение из уже реализованных средств. Возможно они и работают, но я не смог убедиться в этом. Был написан скрипт для решения задачи:
#!/bin/bash
echo "run it"

filename=/var/www/html/counter.txt
current=0
max=0
lim=0
cnt=1
totalcount=1
while read -r string
do
        for word in $string; do

                 if [ "$cnt" -eq "1" ]
                         then  current=$word
                 elif [ "$cnt" -eq "2" ]
                        then  max=$word
                 else
                          lim=$word
                 fi
                cnt=$((cnt+1))

        done

done < "$filename"


echo "$current"
echo "$max"
echo "$lim"


 while [ "$current" -le "$max" ]
 do
                if [ -d /var/www/html/questions/"$current"/ ]; then
                         cd /var/www/html/questions/"$current"/
                         find . ! -perm 0755 -exec chmod 0755 {} \;
                         find . ! -user www-data -exec chown www-data.www-data {} \;
                         totalcount=$((totalcount+1))
                fi

                echo "loop"
                current=$((current+1))


                if [ "$totalcount" -gt "$lim" ]
                        then break
                fi

 done

 echo  "$current $max $lim"
 echo  "$current $max $lim" > /var/www/html/counter.txt

 cd /var/www/html/


где counter.txt - файл с текущей папкой, максимальным количеством файлов и лимитом в таком виде
1 1150022 60
Нужно не забыть установить скрипту chown +x script.sh
Далее ставим cron на каждую минуту:
*/1 * * * *  /var/www/html/script.sh >/dev/null 2>/dev/null


И вуаля: 364 1151860 60 - через 5 минут
Скорость и лимит зависит от вашего сервера, диска, в моем случае 1ГБ ОЗУ и 6 000 000 иннодов почти, что значительно уменьшает скорость.
Примерно через 2000 минут (~14 дней) будут установлены привилегии и владельцы для всех ~2 400 000 файлов
Как ускорить?
запускать скрипт с разными counters.txt:
1 180000 60
180000 360000 60
360000 540000 60
540000 720000 60
720000 100000 60
100000 120000 60

в 6 раз быстрее, что в теории дает нам результат примерно за 2 дня
  • Вопрос задан
  • 1132 просмотра
Решения вопроса 1
@Aves
man find гласит
find dir ! -perm 0755 -exec chmod 0755 {} \;
find dir ! -user root -exec chown root {} \;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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