У меня есть эта команда в файле .sh

sudo find $PROJECT_ROOT -type f \
     -exec sudo chmod ugo-x '{}' \; \
     -exec sudo chmod go-w '{}' \; 

Как видите, для каждого файла мне нужно удалить разрешение на запись для группы и других, оставив «как есть» окончательное разрешение на запись для пользователя.

И удалить разрешение на выполнение для каждого.

Я спрашиваю вас, есть ли способ оптимизировать это ... У меня нет большого опыта работы с chmod, но это отнимает много времени: 4-5 минут на каждую папку проекта, для каждого из наших 41 реальных проектов, и это должно выполняться 2 раза в неделю. (Пожалуйста, не спрашивайте, ПОЧЕМУ, это не важно, я должен это сделать)

2 ответа2

1

Упростите команду следующим образом, а затем проверьте, улучшает ли она производительность:

sudo find $PROJECT_ROOT -type f -exec sudo chmod a-x,go-w '{}' \; 
1

В дополнение к ответу @ Sisir, первое, что вы можете сделать, это использовать «+» вместо «;» в команде поиска. Это заставляет его выполнять одну единственную команду для всех соответствующих файлов вместо одной команды для файла:

sudo find $PROJECT_ROOT -type f -exec chmod a-x,go-w '{}' +

Если проекты содержат слишком много файлов (есть ограничения на длину командной строки), вы все равно можете использовать один отдельный chmod на каталог с небольшим дополнительным скриптом:

#! /bin/bash
# chmod's all files in the $1 directory
find "$1" -maxdepth 1 -type f -exec chmod a-x,go-w {} +

а потом:

sudo find $PROJECT_ROOT -type d -exec chmod_script {} \;

(кстати, я не думаю, что вам нужна sudo для команды, выполняемой find , обычно она должна наследовать идентификатор пользователя find?)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .