Это более общий вопрос о 'chmoding' рекурсивно.
У меня есть этот скрипт, который в какой-то момент должен рекурсивно изменить разрешения в папке, которая имеет несколько сотен тысяч файлов. Новые файлы добавляются в эту папку каждый день, но те, которые уже есть, имеют уже установленные разрешения и не меняются.
Мой вопрос ... когда я звоню
чмод 775. -Р
пытается ли он установить разрешение для файлов, для которых уже установлены нужные разрешения, или только для новых файлов, которые не имеют необходимых разрешений?
Кажется, что для обхода этой команды в скрипте всегда требуются годы, хотя «новых» файлов всего несколько тысяч, и они должны делать свои разрешения довольно быстро.
Я посмотрел на страницу руководства по chmod, но в этом случае ничего не упоминается.
Если chmod не проверяет заранее разрешения, должен ли я начать смотреть на объединение 'find' с 'chmod'?
источник
Ответы:
chmod
может или не может изменить разрешения файлов, которые уже установлены на то, что вы хотите, но если нет, он все равно должен проверить их, чтобы увидеть, каковы их текущие разрешения [0]. С сотнями тысяч файлов, я не думаю, что это будет иметь значение в любом случае; время, скорее всего, тратится инструментами наstat
каждый файл.Вы можете попробовать использовать
find
либо для проверки файлов новее, чем последний запуск, либо файлов, которые необходимоchmod
запустить, но я не думаю, что вы получите значительное улучшение скорости.Если это возможно для вашего сценария, вы можете сначала поместить новые файлы в отдельную директорию, как область хранения. Тогда вы можете
chmod
ТО каталог (в котором только новые файлы), иmv
их вместе с остальными. Это должно быть значительно быстрее, но, к сожалению, не будет работать для каждого приложения.[0] Даже если он попытается установить разрешение для файлов, которые не нуждаются в каких-либо изменениях, базовая файловая система, вероятно, ничего не сделает с запросом, потому что это не нужно.
источник
оптимизация find / chmod
И то
find
и другоеchmod
читатьВероятно, вы получите улучшение производительности, сначала прочитав все записи, а затем все inode (на вращающемся диске), потому что тогда головка диска не перемещается между каталогом и inode). Как
chmod
это глупо (как один из других ответов объясняет), следует назвать черезfind
только. Но даже тогда это может помочь прочитать все inode до того, как будет записан первый (при условии, что у вас достаточно свободной оперативной памяти для дискового кэша). Я предлагаю это:Хорошее решение: списки ACL
Хорошее решение может быть совершенно другим: если файлы создаются в этом каталоге (а не перемещаются откуда-либо еще), то списки ACL могут выполнять эту работу на лету. Вам просто нужно установить ACL по умолчанию в родительском каталоге.
Дальнейшее улучшение может быть достигнуто за счет оптимизации файловой системы. Если это ext3 / ext4, то вы можете запускать
e2fsck -D
время от времени. Может быть, это поможет поместить этот каталог на отдельный том. Вы можете попробовать разные файловые системы или настройки файловой системы (например, разные размеры inode).источник
find
Решение о удвоилась мое время,chmod
ИНГ внутри Docker контейнера.Если предположить , что использование
chmod
из пакета GNU Coreutils на Ubuntu 12.10.chmod 775 . -R
выполняетfchmodat
системный вызов для каждого файла, который он находит, независимо от того, нужно ли изменять разрешения или нет. Я подтвердил это, проверив код и используяstrace chmod 775 . -R
(фрагмент ниже) для отображения фактического поведения.Есть несколько недостатков запуска
fchmodat
каждого файла.find
/xargs
/,chmod
упомянутый другими, скорее всего, будет быстрее, изменяя только те файлы, которые нужно изменить.fchmodat
изменяет изменение статуса файла (ctime) каждого файла. Это приведет к тому, что каждый файл / индекс будет меняться каждый раз и, вероятно, приведет к избыточной записи на диск. Может быть возможно использовать параметры монтирования, чтобы остановить эти лишние записи.Простой эксперимент показывает изменения ctime, происходящие для прямой
chmod
Но это не изменится
find
/xargs
/chmod
через несколько минутЯ всегда склонен использовать
find
/xargs
/chmod
версию, потому что поиск дает больше контроля над выбором вещей.источник
[Source] (1) показывает, что
chmod(1)
всегда пытается установить режим, а затем проверяет снова с помощью [fstatat (2)] (2).Файлы обрабатываются с помощью [fts (3)] (3), который должен предварительно "просчитать" все пройденные объекты файловой системы, чтобы построить свое дерево данных.
В Unixlore есть [хорошая статья] (4),
chmod(1)
которая рассчитана против подходаfind
/xargs
: последний выигрывает по величине.Здесь командная строка адаптирована к исходному вопросу:
Две причины:
Обход файловой системы отделен от операций над файлами по каналу между двумя процессами, которые могут даже выполняться на разных ядрах.
fts(3)
операция сводится к минимуму, потому чтоxargs(1)
«выравнивает» дерево каталогов.Так что да: вы должны обязательно использовать
find
/xargs
. для простого решения.Другие опции:
Поиграйте с [umask] (5) и исходным кодом процесса (ов), пишущих новые файлы.
Если вы используете Linux, скорее всего, ваша система
inotify
включила подсистему ядра. В этом случае вы можете написать эффективное решение с помощью [inotifywait (1)] (6).Примечание: если вы не хотите разрешать выполнение ваших файлов, я бы предложил изменить вызов следующим образом:
Примечание для редакторов: я не имею права добавлять более двух ссылок на сообщение, а также комментировать другие сообщения. Я оставляю здесь ссылки и надеюсь, что какой-нибудь открытый человек с достаточной репутацией вернет их обратно в текст и удалит этот абзац.
Комментарий на грунтования кэш диска с
find . -printf ""
:Это может ускорить выполнение следующих
chmod
операций, однако зависит от доступной памяти и загрузки ввода-вывода. Так может сработать или нет. Разделение traversal (find
) иchmod
операции уже обеспечивает кэширование, поэтому заполнение кэша может быть излишним.источник
Рассматривали ли вы изменение процесса (ов), которые создают файл, чтобы они были созданы в режиме 0775? Посмотрите на значение umask в окружающей среде - 0002 может помочь.
источник