#unix #chmod #chown
Всем привет, на сервере стоит апач и куча папок ~ 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/
Ответы
Ответ 1
наиболее быстрый, как мне представляется, вариант — выполнить это одной командой 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Ответ 2
Простейший вариант выглядит как-то так: 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 файлов - мол большие у них были при восстановлении).
Комментариев нет:
Отправить комментарий