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

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

29.07.2015 10:28:15 Просмотров 28 Источник

Всем привет, на сервере стоит апач и куча папок ~ 1 200 000 папок, и в каждой по 1 файлу. Все находится на Amazon aws, linux ubuntu.

Нужно всем 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 -права -rw-r--r-- dir/ | xargs -p chmod 0755 -R dir/ 
У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/438762/chown-%d0%b8-chmod-%d0%b4%d0%bb%d1%8f-%d0%b1%d0%be%d0%bb%d1%8c%d1%88%d0%be%d0%b3%d0%be-%d0%ba%d0%be%d0%bb%d0%b8%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2#comment547808_438762
Всем спасибо, вопрос решен ссылка

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

Nickolay

30.07.2015 01:25:46

Простейший вариант выглядит как-то так:

find /путь/к/dir -type f -print0 | xargs -0 chmod 0755

find рекурсивно обходит все внутри указанной папки, -type f выводит только файлы, -print0 выводит найденное с разделителем \0 (который точно не встречается в путях, в отличие от пробелов и переносов строк) в stdout.

Далее xargs читает из stdin список файлов (-0 задает разделитель), нарезает их на блоки с разумным количеством файлов в каждом блоке, и выполняет chmod 0755 файл1 файл2 ....

Отталкиваясь от этой команды, можно модифицировать ее под ваши нужды, поглядывая на man.

Например, find может искать по owner'у (-user, -group), по правам (-perm - про синтаксис надо внимательно прочитать в документации).

PS. 1) Вообще я бы наверное сохранил бы список всех файлов, разбил бы его на куски и работал бы по кускам. 2М файлов это как-то очень много.

2) Вообще у find есть опция -exec, но я никогда не могу запомнить ее синтаксис, поэтому использую xargs

3) А вам точно все эти 2М файлов нужны? Я бы старался не плодить миллионы маленьких файлов - а то будет еще много аналогичных проблем (меня как-то админы ругали за 500k файлов - мол большие у них были при восстановлении).

aleksandr barakin

30.07.2015 01:47:01

наиболее быстрый, как мне представляется, вариант — выполнить это одной командой find за один проход. примерно так:

$ find /путь/ -type f -exec chmod u=rwx,go=rx {} + -exec chown www-data:www-data {} +

без каких-либо дополнительных проверок, абсолютно бесполезных в данной ситуации, и лишь занимающих лишнее время.

p.s. кстати, рекомендую не ломать себе голову над значением всех этих загадочных 0755, 1644 и т.п., а пользоваться мнемоническими обозначениями:

  • u — пользователь-владелец
  • g — группа-владелец
  • o — все остальные
  • r — право читать
  • w — право изменять
  • x — право исполнять

пример:

u=rwx,go=rx — дать пользователю-владельцу права читать, изменять и исполнять, а группе-владельцу и всем остальным — право читать и исполнять.

можно указывать не только конкретный набор прав, но и изменение прав:

u+x,o-w — добавить пользователю-владельцу право исполнять, всех остальных (не пользователя-владельца и не группу-владелеца) — лишить права изменять.

подробнее об этом можно прочитать (если установлена программа info) здесь:

$ info file permissions
https://ru.stackoverflow.com/questions/438762/chown-%d0%b8-chmod-%d0%b4%d0%bb%d1%8f-%d0%b1%d0%be%d0%bb%d1%8c%d1%88%d0%be%d0%b3%d0%be-%d0%ba%d0%be%d0%bb%d0%b8%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2/438784#comment517576_438784
Про мнемонические обозначения очень полезно было узнать.
Закрыть X